PHP中使用php://input處理相同name值的表單數(shù)據(jù)
在去年10月份,我在博客中分析了php接收前臺(tái)name值相同的表單提交數(shù)據(jù)的處理的問題,當(dāng)時(shí)說的方案是為把name值改成數(shù)組類型,php接收到之后,再對數(shù)組進(jìn)行合并處理。這樣做的缺點(diǎn)就是不完全兼容前臺(tái)表單,用戶必須要對表單作出更改,而系統(tǒng)需求是所有升級對用戶完全透明,所以說這種方式還是不夠完美。
經(jīng)過差不多一年時(shí)間的沉淀,發(fā)現(xiàn)php提供原始的訪問輸入/輸出流的方法,POST的數(shù)據(jù)可以通過php://input來獲取:
php://input 是個(gè)可以訪問請求的原始數(shù)據(jù)的只讀流。 POST 請求的情況下,最好使用 php://input 來代替 $HTTP_RAW_POST_DATA,因?yàn)樗灰蕾囉谔囟ǖ?php.ini 指令。 而且,這樣的情況下 $HTTP_RAW_POST_DATA 默認(rèn)沒有填充, 比激活 always_populate_raw_post_data 潛在需要更少的內(nèi)存。 enctype=”multipart/form-data” 的時(shí)候 php://input 是無效的。
php://input 打開的數(shù)據(jù)流只能讀取一次; 數(shù)據(jù)流不支持 seek 操作。 不過,依賴于 SAPI 的實(shí)現(xiàn),請求體數(shù)據(jù)被保存的時(shí)候, 它可以打開另一個(gè) php://input 數(shù)據(jù)流并重新讀取。 通常情況下,這種情況只是針對 POST 請求,而不是其他請求方式,比如 PUT 或者 PROPFIND。
所以用php獲取相同name值的表單數(shù)據(jù)的思路可以是這樣,1,通過php://input獲取原始的POST數(shù)據(jù); 2,對數(shù)據(jù)進(jìn)行處理合并; 3, 重新把處理過的值賦給系統(tǒng)變量$_POST; 下面是定義的一個(gè)函數(shù):
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值進(jìn)行處理 //去空格和[] $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來獲取處理之后各個(gè)表單的數(shù)據(jù)。
相關(guān)文章
PHP 反射機(jī)制實(shí)現(xiàn)動(dòng)態(tài)代理的代碼
通過代理類ClassOneDelegator來代替ClassOne類來實(shí)現(xiàn)他的方法。2008-10-10linux環(huán)境apache多端口配置虛擬主機(jī)的方法深入介紹
本篇文章是對linux環(huán)境apache多端口配置虛擬主機(jī)的方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-06-06php5.2以下版本無json_decode函數(shù)的解決方法
這篇文章主要介紹了php5.2以下版本無json_decode函數(shù)的解決方法,需要的朋友可以參考下2014-05-05php SQLite學(xué)習(xí)筆記與常見問題分析
php SQLite學(xué)習(xí)資料收集,與一些常見問題的解決方法2008-07-07PHP面向?qū)ο笕筇攸c(diǎn)學(xué)習(xí)(充分理解抽象、封裝、繼承、多態(tài))
PHP面向?qū)ο笕筇攸c(diǎn)學(xué)習(xí) 學(xué)習(xí)目標(biāo):充分理解抽象、封裝、繼承、多態(tài)2012-05-05javascript+php實(shí)現(xiàn)根據(jù)用戶時(shí)區(qū)顯示當(dāng)?shù)貢r(shí)間的方法
這篇文章主要介紹了javascript+php實(shí)現(xiàn)根據(jù)用戶時(shí)區(qū)顯示當(dāng)?shù)貢r(shí)間的方法,實(shí)例分析javascript獲取客戶端時(shí)區(qū)及與服務(wù)器端php交互的技巧,具有一定參考借鑒價(jià)值,需要的朋友可以參考下2015-03-03