程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> PHP綜合 >> PHP中使用php://input處理相同name值的表單數據

PHP中使用php://input處理相同name值的表單數據

編輯:PHP綜合

在去年10月份,我在博客中分析了php接收前台name值相同的表單提交數據的處理的問題,當時說的方案是為把name值改成數組類型,php接收到之後,再對數組進行合並處理。這樣做的缺點就是不完全兼容前台表單,用戶必須要對表單作出更改,而系統需求是所有升級對用戶完全透明,所以說這種方式還是不夠完美。

經過差不多一年時間的沉澱,發現php提供原始的訪問輸入/輸出流的方法,POST的數據可以通過php://input來獲取:
復制代碼 代碼如下:
php://input 是個可以訪問請求的原始數據的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因為它不依賴於特定的 php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內存。 enctype=”multipart/form-data” 的時候 php://input 是無效的。
php://input 打開的數據流只能讀取一次; 數據流不支持 seek 操作。 不過,依賴於 SAPI 的實現,請求體數據被保存的時候, 它可以打開另一個 php://input 數據流並重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。

所以用php獲取相同name值的表單數據的思路可以是這樣,1,通過php://input獲取原始的POST數據; 2,對數據進行處理合並; 3, 重新把處理過的值賦給系統變量$_POST; 下面是定義的一個函數:

function GET_SUBMIT(){
 if(empty($_POST)) return $_POST;
 //判斷提交類型
 if($_SERVER["HTTP_CONTENT_TYPE"] != 'application/x-www-form-urlencoded'){
 return $_POST;
 }
 //獲取POST原始值
 $data= file_get_contents("php://input");
 if(empty($data)) return $_POST;
 //開始處理
 $POST=array();
 $list=explode('&',$data);
 foreach($list as $key=>$value){
 //獲取POST的KEY和Value值
 $postname=urldecode(substr($value,0, stripos($value,"=")));
 $postvalue=urldecode(substr($value,(stripos($value,"=")+1)));
 //對KEY值和Value值進行處理
 //去空格和[]
 $postname=trim($postname,' ,[,]');
 $postvalue=trim($postvalue);
 if(array_key_exists($postname,$POST)){
  $POST[$postname]=$POST[$postname]." ,".$postvalue;
 }else{
  $POST[$postname]=$postvalue;
 }
 }
 return $POST;
}

接下來只要在需要的地方使用”$_POST=GET_SUBMIT()”, 後面就可以通過$_POST來獲取處理之後各個表單的數據。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved