我平時總是喜歡用$_REQUEST這個數組,不是因為別的,簡單,而且想用GET時候就用GET直接測試即可。還可以把URL打出來,很是方便。從而很少用$_GET和$_POST超全域變數。
不過,從今以後我會盡量不再使用$_REQUEST這個數組,因為以前對這個數組有些一知半解,總以為用起來簡單,並且隨心所欲,和$_GET與$_POST一樣,而且由系統為我判斷,多好。下面我就來簡單的介紹一下為何不應該使用$_REQUEST這個數組。
我們都知道,處理表單資料,可以使用PHP的$_GET和$_POST這兩個超全域變數,具體是哪個由form表單提交時的method指定。除此之外PHP還為我們提供了$_REQUEST數組。但是其不僅包含$_GET和$_POST的所有資料元素,同時其還會包含$_COOKIE這個超全域數組的所有資料元素。
可是大家有沒有想過,如果這三個數組裡面的key相同,那麼我用$_REQUEST得到的到底是哪個數組的值呢?會不會有什麼問題?
我用如下代碼為大家做示範,因為只是想說明問題,所以這裡面不對$_COOKIE進行設定,請大家自行處理:
<?php
var_dump($_GET['a'],$_POST['a'],$_REQUEST['a']);
?>
<html>
<head><title>demo</title></head>
<body>
<form method= 'post' action = 'req.php?a=xxx'>
<input type='hidden' name='a' value='yyy'/>
<input type='submit' name='submit' value='submit'/>
</form>
</body>
</html>
當我提交表單的時候,我擷取的頁面內容為:
string(3) "xxx" string(3) "yyy" string(3) "yyy"
同樣的內容,在$_REQUEST裡面,POST的值覆蓋了GET的值,這到底是怎麼回事呢?
其實這是在PHP的設定檔裡面設定的,讓我們來看一下php.ini這個設定檔,在第466行左右有如下內容:
; 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"
這個EGPCS就是說明用$_REQUEST數組擷取內容的優先順序,其字母的含義分別代表為:E代表$_ENV,G代表$_GET,P代表$_POST,C代表$_COOKIE,S代表$_SESSION。後面出現的資料會覆蓋前面寫入的資料,其預設的資料寫入方式就是EGPCS,所以POST包含的資料將覆蓋GET中使用相同關鍵字的資料。
所以為了避免此問題,我們應該明確的使用$_GET和$_POST全域變數,在要用到$_REQUEST 的時候想一下,是不是真的需要用$_REQUEST,為什麼提交的方式不是固定的,這樣設計程式是否有問題?是否是設計過度,也許我們為了可擴充性卻導致了意想不到的問題發生,這顯然是不值得的,而且提交方式只能有一種,為什麼要考慮兩種情況呢?
這裡同時給大家兩個建議:
1. 盡量不要設定全域的cookie,如果不是必須的話
2. 建議不使用Request 方法來擷取變數