tp5獲取不到get值
使用過tp5和tp3版本朋友,會發現tp5完全是thinkphp的一次重構。給我們的不是版本的升級,完全就是兩個不同的框架嘛。如果用習慣了tp3,斷崖式跳到了tp5,難免會不適應。
其中就有一個對$_GET這個全域性變數的使用問題,在有些情況下,tp5無法使用$_GET獲取資料?
如果你的請求的地址引數是以pathinfo形式,這樣引數是無法用$_GET去獲取的,同樣也不能使用系統中的get方法。
比如:
//請求地址"http://www.xxx.com/index/user/uid/100"
public function user() {
print_r($_GET['uid']);//獲取不uid,會丟出一個異常
print_r(input('get.uid'))//結果為空
print_r(input('id'))//ok,正常獲取
print_r(input('param.id'))//ok,正常獲取
print_r(Request::instance()->param('id'))//ok,正常獲取
print_r(Request::instance()->get('id'))//結果為空
}
以上方法都是tp5獲取常見的get引數的獲取方式,結果能驗證上面的結論。我們再看看以下地址請求:
//請求地址為"http://www.xxx.com/index/user?uid=100"
public function user() {
print_r($_GET['uid']);//ok,正常獲取
print_r(input('get.uid'))//ok,正常獲取
print_r(input('id'))//ok,正常獲取
print_r(input('param.id'))//ok,正常獲取
print_r(Request::instance()->param('id'))//ok,正常獲取
print_r(Request::instance()->get('id'))//ok,正常獲取
}
這樣普通傳參方式,get方法和$_GET就能正常獲取。我們再看看混合式地址方式
//請求地址為"http://www.xxx.com/index/user/uid/100?name=chenxing"
public function user() {
print_r($_GET);//只能獲取name值
print_r(input('get.'))//只能獲取name值
print_r(input(''))//ok,正常獲取所以值
print_r(input('param.'))//ok,正常獲取所以值
print_r(Request::instance()->param(''))//ok,正常獲取所以值
print_r(Request::instance()->get(''))//只能獲取name值
}
混合式地址比較亂,但在ajax請求時生成地址很有可能是這種混合式。
上面的三種請求引數地址在我們日常開發中比較常見,那麼能夠正常獲取的請用系統的param方式獲取,這個是最相容的獲取方式。
回到問題,我們探究為什麼pathinfo中的引數$_GET無法正常獲取?能產生這樣疑問的朋友其實陷入tp3給我們帶來的認知誤區。在tp3中上面的請求的三種方式都可以用$_GET獲取其中的所有引數,久而久之你就習慣了這種寫法,然後就把這種獲取方式變成理所當然。我們撇開框架pathinfo地址同樣無法用$_GET獲取,對於地址中的get請求的引數必須是以”?“開始的。那麼為什麼tp3可以呢?因為tp3把pathinfo中的引數整合到了get請求中。
現在大家應該能夠明白的感受到開頭提到的tp3到tp5這種斷崖式升級了吧。忘掉tp3,讓tp5在我們手中快活的遊走。
tp5的開發手冊:https://www.kancloud.cn/manual/thinkphp5/118003
原文地址:http://www.qiusuoweb.com/72.html