2016-02-18 4 views
1

Мне нужно отправить запрос с именами переменных, которые содержат скобки на удаленной веб-странице через Curl.PHP & Curl: переменная post в квадратных скобках

Далекая форма содержит переменные в скобках, например:

<input name="test[firstname]"> 
<input name="test[lastname]"> 

Итак, я построю свою Cu запрос, как это:

function httpPost($url,$params) 
{ 
    $postData = ''; 
    foreach($params as $k => $v) 
    { 
     $postData .= $k . '='.$v.'&'; 
    } 
    $postData = rtrim($postData, '&'); 

    $ch = curl_init(); 

    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,true); 
    curl_setopt($ch,CURLOPT_HEADER,true); 
    curl_setopt($ch,CURLOPT_POST, count($postData)); 
    curl_setopt($ch,CURLOPT_POSTFIELDS, $postData); 

    $output = curl_exec($ch); 

    if($output === false) 
    { 
     return 'Curl error: ' . curl_error($ch); 
    } 
    else 
    { 
     return $output; 
    } 

    curl_close($ch); 
} 

$params = array(
    "test[firstname]" => "Frank", 
    "test[lastname]" => "Tomaso" 
); 

var_dump($params); 
// array(2) { ["test[firstname]"]=> string(5) "Frank" ["test[lastname]"]=> string(6) "Tomaso" } 

echo httpPost("http://www.mywebsite.tld/search/",$params); 

Скрипт не возвращает ошибку, но ничего появляется на экране ($ output). Если я удалю контент $ params, он выводит страницу, но без каких-либо результатов. Поэтому я думаю, что есть проблема с именами переменных в скобках. Как вы думаете ?

+0

Можете ли вы добавить вывод из 'var_dump ($ params);' в ваш вопрос? – mkaatman

+0

Я сделал то, что вы просили. –

+0

Попробуйте '$ postdata = http_build_query ($ params);' (значения должны быть указаны в urlencoded) – symcbean

ответ

0
foreach($params as $k => $v) 
{ 
    $postData .= $k . '='.$v.'&'; 
} 

Этот фрагмент кода неверен, так как он не URL-кодирование $k и $v, как это должно быть.

Но вам не нужно перебирать более $params, закодировать ключи и значения и вручную построить строку запроса. Функция PHP http_build_query() делает всю тяжелую работу за вас:

$postData = http_build_query($params); 

Вы даже можете иметь:

$params = array(
    'user' => array(
     'firstname' => 'Frank', 
     'lastname' => 'Tomaso', 
    ), 
); 

и http_build_query($params) до сих пор создает правильную строку запроса для вас.

Однако, если он по-прежнему не работает, вы должны внимательно прочитать удаленную форму и отправить значения для всех полей, присутствующих в форме, включая кнопку отправки.

+0

Perfect! И мне пришлось добавить curl_setopt ($ ch, CURLOPT_FOLLOWLOCATION, true); чтобы заставить его работать. –

0

Я думаю, вы можете попробовать вместо вашего массива по

$params = array(
    "test" => ["firstname=>"Frank", "lastname"=>"Tomaso"], 
); 

Затем, когда вы посылаете свернуться вы можете попробовать

$data_param = array('data'=>json_encode($params)) 
curl_setopt($ch,CURLOPT_POSTFIELDS, $data_param); 

В вашем DIST URL, вы можете использовать json_decode для декодирования данных.

Смежные вопросы