Search code examples
phpregexcurlurlencodeurl-encoding

PHP CURL getting 400 error in loop


here the foreach loops returns a phone number which goes in the link but whenever I try to run this script it gives me the error 400 bad request. I have also tried using the useragent but even that does not solve the error. any help would be great.

PS. this is my first question please let me know if I can provide anything to solve this problem.

foreach($var5 as $number) {
     $ch = curl_init();
     $ch1="http://bmsms.co.in/sendsms.aspx?mobile=0000000000&pass=xxxxxxxx&senderid=xxxxxxx&to=$number&msg=hey";
     echo $ch1;
     curl_setopt($ch, CURLOPT_URL, "$ch1");
     curl_setopt($ch, CURLOPT_HEADER, 0);
     //curl_setopt($ch, CURLOPT_USERAGENT, 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36');
     curl_exec($ch);
     curl_close($ch);
}

Update:

When I add urlencode the bad request definitely goes but I want this url to execute: http://bmsms.co.in/sendsms.aspx?mobile=1234567890&pass=password&senderid=ID&to=+ 9408644603&msg=hey but instead this url is executed: http://bmsms.co.in/sendsms.aspx?mobile=1234567890&pass=password&senderid=ID&to=%2B+9408644603&msg=hey

Also here I have only applied urlencode to the phone number rest of the fields I'm entering myself directly. Also the bad request probably goes as the api won't execute if the phone number is not correct.


Solution

  • The + in the phone numbers for some reason is breaking the receiving applications system. URL encoding doesn't resolve this because they only want numbers. You can use a regex to replace all the leading, non-numerical, characters with nothing.

    preg_replace('/^\D+/','', $serverthing)
    

    \D is a non number (\d is a number).
    ^ is the start of the string.
    + is one or more of the previous character/group.
    /s are delimiters showing the start and end of the regex.