我們都知道,處理表單資料,可以使用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中使用相同關鍵字的資料。
$_REQUEST[]具用$_POST[] $_GET[]的功能,但是$_REQUEST[]比較慢。通過post和get方法提交的所有資料都可以通過$_REQUEST數組獲得