PHP "php://input" vs $_POST 質問する

PHP

php://inputJQuery からの Ajax リクエストとやり取りするときに、 の代わりにメソッドを使用するように指示されました$_POST。理解できないのは、$_POSTまたはのグローバル メソッドではなく、 this を使用する利点です$_GET

ベストアンサー1

その理由は、php://inputコンテンツ タイプに関係なく、リクエストの HTTP ヘッダーの後のすべての生データを返すためです。

PHPのスーパーグローバルは$_POST、次のいずれかのデータをラップすることになっています。

  • application/x-www-form-urlencoded(シンプルなフォーム投稿の標準コンテンツタイプ)または
  • multipart/form-data(主にファイルのアップロードに使用されます)

これは、これらのコンテンツタイプのみがユーザーエージェントによってサポートされている必要があるしたがって、サーバーと PHP は従来、他の種類のコンテンツを受信することを想定していません (受信できないという意味ではありません)。

したがって、古き良き HTML を単純に POST するとform、リクエストは次のようになります。

POST /page.php HTTP/1.1

key1=value1&key2=value2&key3=value3

しかし、Ajax を頻繁に使用する場合は、おそらく、型 (文字列、int、bool) や構造 (配列、オブジェクト) を使用したより複雑なデータの交換も含まれるため、ほとんどの場合、JSON が最適な選択です。ただし、JSON ペイロードを含むリクエストは次のようになります。

POST /page.php HTTP/1.1

{"key1":"value1","key2":"value2","key3":"value3"}

コンテンツは現在application/json(または少なくとも上記のいずれでもない) であるため、PHP の$_POST-wrapper はそれを (まだ) 処理する方法を知りません。

データは残っていますが、ラッパー経由ではアクセスできません。そのため、file_get_contents('php://input')(multipart/form-dataエンコードされていない限り)。

これは、XML データやその他の非標準コンテンツ タイプにアクセスする方法でもあります。

おすすめ記事