2012-02-28 7 views
2

私はPHPとカールでポストリクエストを作成しようとしています。ここに私のコードはhttp://localhost/post.phpphp + curlでポストメソッドを設定できません

//PHP 5.3.5 and curl: 7.18.2 
$ch = curl_init(); 
if(!empty($save_cookie)){ 
    curl_setopt($ch, CURLOPT_COOKIEJAR, $save_cookie); 
    curl_setopt($ch, CURLOPT_COOKIEFILE, $save_cookie); 
}else{ 
    curl_setopt($ch, CURLOPT_COOKIE, $cookie); 
} 

curl_setopt($ch, CURLOPT_REFERER, $referer); 
curl_setopt($ch, CURLOPT_USERAGENT, $user_agent); 
curl_setopt($ch, CURLOPT_URL, 'http://localhost/post.php'); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); 
curl_setopt($ch, CURLOPT_POST, true); 
curl_setopt($ch, CURLOPT_POSTFIELDS, $pars); 
curl_setopt($ch, CURLOPT_HEADER, $header); 
curl_setopt($ch, CURLOPT_NOBODY, !$body); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

$postResult = curl_exec($ch); 

if (curl_errno($ch)) { 
    return false; 
} 

curl_close($ch); 
return $postResult; 

ですが、私は

print_r($_SERVER); 

を書くカールの結果リターンがCURLOPT_NOBODYオプションを削除して、それが動作します常に

[REQUEST_METHOD] => GET 
+0

奇妙です。パケットトレースを投稿できますか? (Wiresharkなどを使用してください)また、PHPがCGIまたはモジュールとして呼び出されていますか?どのようなWebサーバーですか? http://redmine.lighttpd.net/issues/1472も参照してください。 POSTデータを設定して、post.phpの '$ _POST'を見れば、あなたのデータが見えるはずです。 – Brad

+0

私はapache + fastcgiを使用しています。私も$ _POSTを印刷しますが、それは空です – complez

答えて

2

です。または、CURLOPT_POST行の上に置きます。

私はこれを一度、レスポンスのヘッダーを取得しようとしているときに遭遇したと思います。

curl_setopt($ch, CURLOPT_NOBODY, true); 

を設定することは効果的POST要求でないHEAD要求を発行するcurlに指示します。私はちょうどPOSTからヘッダーを取得する方法がないと思う(そしてちょうどヘッダーを受け取った後に接続をドロップする)。副作用として、falseCURLOPT_NOBODYを設定することGET ...

に要求タイプを設定し、あなたが本当にCURLOPT_NOBODYフラグが必要ですか?右

curl_setopt($ch, CURLOPT_POSTFIELDS, $pars);

行の前に

curl_setopt($ch, CURLOPT_NOBODY, !$body);

線を移動する

+0

あなたは私の日を救った、それは今働きます! – complez

+0

しかし、問題は 'NOBODY' setoptの3番目のパラメータとしてFALSEを指定しても保持されます。これはバグです。ドキュメントでは、リクエストの種類をGETにリセットしないでください。 – raina77ow

+0

@ raina77owあなたはバグレポートを提出する必要があります! – mvds

2

してみてください。

curl/set_opt pageで興味深い記事がこの動作にいくつかの光を流し、あります:

あなたのPOSTデータが消えているように見える場合(空のPOSTデータを、 GETなどのサーバーによって処理されている要求) CURLOPT_NOBODYで CURLOPT_POSTFIELDSの設定を並べ替えてみてください。 CURLOPT_POSTFIELDSは の後に来ると、 要求がGETではないPOSTであることをURLターゲットに通知するため、CURLOPT_NOBODY設定後には になります。

+0

Content-Typeヘッダーは 'POST'または' GET'について何も教えていません。 – mvds

+0

確かに、間違った言葉を広めるのはなぜですか? – mvds

関連する問題