フォーム [url=javascript:;]POST[/url] と fsockopen 送信メソッドの違いを比較してください。
フォームPOST送信の場合
$_POSTと[url=javascript:;]php[/url]://inputで値を取得できます、$HTTP_RAW_POST_DATAは空です
$_POSTは送信されたデータを連想配列に整理し、 URLdecode などのエンコード、またはエンコード変換。
php://input は、入力ストリームを介したファイル読み取りを通じて未処理の POST 生データを取得できます。
php://input は、POST 生データを読み取ることができます。 $HTTP_RAW_POST_DATA よりもメモリへの負担が少なく、特別な php.ini 設定は必要ありません。 php://input は enctype="multipart/form-data" では使用できません。
fsockopen は POST データを送信します
例:
$sock = fsockopen("localhost", 80, $errno, $errstr, 30);
if (!$sock) die("$errstr ($errno) ");
$data = "txt=" . urlencode("中") . "&bar=" . urlencode("Bar の値");
fwrite($sock, "POST /posttest/resp****e.php 1.0 ");
fwrite($sock, "ホスト: localhost ");
fwrite($sock, "コンテンツタイプ: application/x-www-form-urlencoded ");
fwrite($sock, "コンテンツの長さ: " . strlen($data) . " ");
fwrite($sock, "Accept: */* ");
fwrite($sock, " ");
fwrite($sock, "$data ");
fwrite($sock, " ");
$headers = "";
while ($str = trim(fgets($sock, 4096)))
$headers .= "$str ";
echo " ";
$body = "";
while (!feof($sock))
$body .= fgets($sock, 4096);
fclose($sock);
echo $body;
(1)の結果と同じ
結論:
1. 元の POST データを簡単に取得するには、php://input を使用します
2. $HTTP_RAW_POST_DATA は、POST の Content-Type タイプが PHP によって認識されない場合にのみ有効です
通常、ページ フォームを通じて送信した後など$HTTP_RAW_POST_DATA を通じて POST データを抽出することはできません。そのエンコーディング タイプ属性 (enctype 属性) は application/x-www-form-urlencoded、multipart/form-data です。
注: ページ内の enctype 属性を PHP で認識されない型に明示的に変更した場合でも、無効のままです。
フォーム送信エンコード属性はフォームに制限されているため、データが一致する場合にのみ、認識できないタイプはデフォルトのエンコード方法 (つまり、application/x-www-form-urlencoded) に従って送信されたとみなされます
3. to application/x-www- form-urlencoded タイプは、送信時にのみ取得できます。
-.shtml を追加すると、静的ページとして検索されます。