程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> 網頁編程 >> PHP編程 >> 關於PHP編程 >> 探討PHP變量解析順序如何獲取提交數據

探討PHP變量解析順序如何獲取提交數據

編輯:關於PHP編程

由於提交後並沒有告知該次提交的鏈接URL,所以這個BUG一直活到了今天。然而並不是每一次提交都會出現這個BUG,幾次測試後發現只有在連續多次提交時發生。由於提交的表單比較復雜,分幾部分錄入,於是懷疑在中間環節發生錯誤。

排錯的過程先是在各個過程中var_dump($_REQUEST),於是連續第二次提交時找到出錯環節,在第一個表單提交到第二個表單的過程中,$_REQUEST數組發生改變。到這裡,我們有必要再看一下$_REQUEST數組:

手冊上講包含經由 GET,POST 和 COOKIE 機制提交至腳本的變量,因此該數組並不值得信任。以此將var_dump($_REQUEST)分解成var_dump($_POST),var_dump($_GET),var_dump($_COOKIE),問題就比較清晰了,原來為了便於在多個頁面表單間保存值,試用了COOKIE,雖然沒有設置expire項的情況下SESSION結束時COOKIE變銷毀,但是如果在一次會話中連續提交多個廣告,表單POST的值變會被之前保存在COOKIE的值覆蓋,而之所以只有部分出錯,在於保存到COOKIE的時候COOKIE變量名都加了前綴,除了url這個變量還是使用相同的變量名。

問題找到了,但是又有新的疑問,相同的變量名,為什麼是COOKIE覆蓋了POST而不是相反呢?於是終於要來到標題講的variables_order設置項了,php.ini中原文如下:

This directive describes the order in which PHP registers GET, POST, Cookie,
Environment and Built-in variables (G, P, C, E & S respectively, often
referred to as EGPCS or GPC). Registration is done from left to right, newer
values override older values.

意思是該設置描述PHP解析變量順序,包括$_GET,$_POST,$_COOKIE,$_ENV ,$_SERVER 數組,
解析順序從左到右,後解析新值覆蓋舊值。默認設定為EGPCS(Environment,GET,POST,Cookie,Server)。
如果將其設為“GP”,會導致 PHP 完全忽略環境變量,cookies 和 server 變量,並用 POST 方法的變量覆蓋 GET 方法的同名變量。

結論:

就像手冊上講的,$_REQUEST是個並不值得信任的數組。為了盡量避免類似問題,在獲取提交值是應明確使用$_POST或$_GET數組。

特殊情況下可以通過調整variables_order設置,使自己總是能得到想要獲取的提交數據。


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