1. ホーム
  2. php

[解決済み】PHP "php://input" vs $_POST

2022-03-31 22:18:03

質問

という方法を指示されたことがあります。 php://input の代わりに $_POST JQuery からの Ajax リクエストを処理するとき。私が理解していないのは、これを使用する利点と、グローバルメソッドの $_POST または $_GET .

解決方法は?

その理由は php://input は、リクエストの HTTP-header の後に、コンテントタイプに関係なく、すべての生データを返します。

PHP のスーパーグローバルである $_POST のみです。 が想定されています。 のどちらかであるデータをラップします。

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

というのも、これらのコンテンツタイプは、唯一 が必要です。 ユーザーエージェントがサポートする . つまり、サーバーと PHP は伝統的に他のコンテンツ・タイプを受け取ることを想定していないのです (受け取れないという意味ではありません)。

ですから、単に古き良きHTMLの form の場合、リクエストは次のようになります。

POST /page.php HTTP/1.1

key1=value1&key2=value2&key3=value3

しかし、Ajaxをよく使う場合、型(string, int, bool)や構造体(array, object)を使ったより複雑なデータのやり取りも含まれるので、ほとんどの場合、JSONが最適な選択です。しかし、JSONペイロードを持つリクエストは、次のようになります。

POST /page.php HTTP/1.1

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

この場合、コンテンツは次のようになります。 application/json (あるいは少なくとも上記のどれにも当てはまらない)ので、PHPの $_POST -ラッパーはそれをどう扱うか(まだ)知らないのです。

データはまだそこにあり、ラッパーを通してアクセスできないだけです。そのため、自分で生のデータを取得するには file_get_contents('php://input') ( でない限りは multipart/form-data -エンコード ).

これは、XML-dataやその他の非標準的なコンテンツ・タイプにアクセスする方法でもある。