慎用PHP $_REQUEST數組

我平時總是喜歡用$_REQUEST這個數組,不是因爲別的,簡單,而且想用GET時候就用GET直接測試即可。還可以把URL打出來,很是方便。從而很少用$_GET和$_POST超全局變量。

不過,從今以後我會盡量不再使用$_REQUEST這個數組,因爲以前對這個數組有些一知半解,總以爲用起來簡單,並且隨心所欲,和$_GET與$_POST一樣,而且由系統爲我判斷,多好。下面我就來簡單的介紹一下爲何不應該使用$_REQUEST這個數組。

我們都知道,處理表單數據,可以使用PHP的$_GET和$_POST這兩個超全局變量,具體是哪個由form表單提交時的method指定。除此之外PHP還爲我們提供了$_REQUEST數組。但是其不僅包含$_GET和$_POST的所有數據元素,同時其還會包含$_COOKIE這個超全局數組的所有數據元素。

可是大家有沒有想過,如果這三個數組裏面的key相同,那麼我用$_REQUEST得到的到底是哪個數組的值呢?會不會有什麼問題?

我用如下代碼爲大家做演示,因爲只是想說明問題,所以這裏面不對$_COOKIE進行設置,請大家自行處理:

[cc lang='html']
var_dump($_GET['a'],$_POST['a'],$_REQUEST['a']);
?>






[/cc]

當我提交表單的時候,我獲取的頁面內容爲:

[cc lang='php']
string(3) “xxx” string(3) “yyy” string(3) “yyy”
[/cc]

同樣的內容,在$_REQUEST裏面,POST的值覆蓋了GET的值,這到底是怎麼回事呢?

其實這是在PHP的配置文件裏面設置的,讓我們來看一下php.ini這個配置文件,在第466行左右有如下內容:

[cc lang='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.
variables_order = “EGPCS”
[/cc]

這個EGPCS就是說明用$_REQUEST數組獲取內容的優先級,其字母的含義分別代表爲:E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SESSION。後面出現的數據會覆蓋前面寫入的數據,其默認的數據寫入方式就是EGPCS,所以POST包含的數據將覆蓋GET中使用相同關鍵字的數據。

所以爲了避免此問題,我們應該明確的使用$_GET和$_POST全局變量,在要用到$_REQUEST 的時候想一下,是不是真的需要用$_REQUEST,爲什麼提交的方式不是固定的,這樣設計程序是否有問題?是否是設計過度,也許我們爲了可擴展性卻導致了意想不到的問題發生,這顯然是不值得的,而且提交方式只能有一種,爲什麼要考慮兩種情況呢?

這裏同時給大家兩個建議:

1. 儘量不要設置全域的cookie,如果不是必須的話

2. 建議不使用Request 方法來獲取變量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章