$POST 、$HTTP_RAW_POST_DATA、php://input三者之間的區別

lankecms發表於2016-03-26

$POST 、$HTTP_RAW_POST_DATA、php://input三者之間的區別

總是產生變數包含有原始的 POST 資料。否則,此變數僅在碰到未識別 MIME 型別的資料時產生。不過,訪問原始 POST 資料的更好方法是 php://input。$HTTP_RAW_POST_DATA 對於 enctype="multipart/form-data" 表單資料不可用。 

問題:    $HTTP_RAW_POST_DATA  == $_POST  嗎?  --->答案是為否。

個人理解總結是這麼玩的:

1:$POST我們常用的就不用介紹了吧

2:$GLOBALS['HTTP_RAW_POST_DATA']:

基本上$GLOBALS['HTTP_RAW_POST_DATA'] 和 $_POST是一樣的。但是如果post過來的資料不是PHP能夠識別的,你可以用$GLOBALS['HTTP_RAW_POST_DATA']來接收,比如 text/xml 或者 soap 等等。

PHP預設識別的資料型別是application/x-www.form-urlencoded標準的資料型別,用Content-Type=text/xml 型別,提交一個xml文件內容給了php server,要怎麼獲得這個POST資料。 

由於PHP預設只識別application/x-www.form-urlencoded標準的資料型別,因此,對型如text/xml的內容無法解析為$_POST陣列,故保留原型,交給$GLOBALS['HTTP_RAW_POST_DATA'] 來接收。

3:php://input 也可以實現此這個功能:

php://input 允許讀取 POST 的原始資料。和 $HTTP_RAW_POST_DATA 比起來,它給記憶體帶來的壓力較小,並且不需要任何特殊的 php.ini 設定。php://input 不能用於 enctype="multipart/form-data"。

例子:

leyangjun.html

<form action="leyangjun.php" method="post">

<p>First name: <input type="text" name="fname" /></p>

<p>Last name: <input type="text" name="lname" /></p>

<input type="submit" value="Submit" />

</form>

leyangjun.php:

<?php

echo "<pre>";

print_r($_POST);

$data = file_get_contents('php://input');   //都要解下碼

print_r(urldecode($data));

echo "<br>";

print_r(urldecode($GLOBALS['HTTP_RAW_POST_DATA']));

?>

相關文章