1. 程式人生 > >php POST,HTTP_RAW_POST_DATA, and php://input

php POST,HTTP_RAW_POST_DATA, and php://input

1、HTML <form> enctype Attribute

  • application/x-www-form-urlencoded  傳送之前所有的字元都會被encoded,(spaces 被轉換為+、特殊字元被轉換為ASCII HEX)
  • multipart/form-data  沒有字元被encoded,一般用upload
  • text/plain Spaces被轉換為 + ,但是特殊字元不會被encoded

For example, the key-value pairs

1

2

3

name: Jonathan Doe

age: 23

formula: a + b == 13%!

are encoded as the following raw data:

1

name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

$_POST

1

2

3

4

5

6

Array

(

[name] => Jonathan Doe

[age] => 23

[formula] => a + b == 13%!

)

$HTTP_RAW_POST_DATA

1

2

print_r($GLOBALS['HTTP_RAW_POST_DATA'] );

name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

php://input

1

2

3

4

$post_data = file_get_contents('php://input');

print_r($post_data);

name=Jonathan+Doe&age=23&formula=a+%2B+b+%3D%3D+13%25%21

2、$_POST

$_POST是最常用的獲取表單的方式,它是以關聯陣列方式組織提交的資料,並對此進行編碼處理,如urldecode,甚至編碼轉換,識別的資料型別是PHP預設識別的資料型別 application/x-www.form-urlencoded

無法解析如text/xml,application/json等非 application/x-www.form-urlencoded 資料型別的內容

3、$HTTP_RAW_POST_DATA

PHP預設識別的資料型別是application/x-www.form-urlencoded,用Content-Type=application/json 型別,提交的POST資料這時候 POST就無法獲取到了,但是使用POST就無法獲取到了,但是使用GLOBALS['HTTP_RAW_POST_DATA'] 可以獲取到。因為在PHP無法識別Content-Type的時候,就會把 POST 資料填入到 $HTTP_RAW_POST_DATA 中。

  • 設定 php.ini 中的 always_populate_raw_post_data 值為 On 才會生效

  • 當POST可以取到值時POST可以取到值時HTTP_RAW_POST_DATA 為空

  • 不能用於 enctype="multipart/form-data"

4、php://input

php://input 可通過輸入流以檔案讀取方式取得未經處理的POST原始資料,允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小。

  • 不需要任何特殊的 php.ini 設定

  • 不能用於 enctype="multipart/form-data"

總結

1、如果是 multipart/form-data  和 application/x-www-form-urlencoded 格式 用 $_POST

2、如果不能獲取的時候比如 application/json 使用 file_get_contents('php://input')