平時在工做中常常要寫 $xxx = urldecode($_GET['xxx']);的相似代碼,大部分的狀況都是沒有問題的.也能很好的工做.
因此也沒有怎麼在乎.可是忽然有一天我想到 $xxx =$_GET['xxx']和$xxx = urldecode($_GET['xxx']); 獲取的值都是同樣的,那爲什麼還須要作一次urldecode呢
爲此我作一下測試.
個人測試代碼1.php 以下
<?php
var_dump($_GET);
只是將請求上帶的參數值打印出來而已
咱們以中國爲例子進行說明
咱們分紅如下3中狀況
a 當 中國 未進行urlencode編碼的時候
執行的結果:
array (size=1)
'a' =>
string
'中國' (length=6)
執行的結果:
array (size=1)
'a' =>
string
'中國' (length=6)
c 當 中國 進行2次urlencode編碼的時候===> %25E4%25B8%25AD%25E5%259B%25BD
執行的結果:
array (size=1)
'a' =>
string
'%E4%B8%AD%E5%9B%BD' (length=18)
從以上可知
當咱們用$_GET的時候其實已經進行了一次urldecode的操做.
這裏特別要說明一點的是 a的狀況,明明傳入值就是中國,按照剛纔的說明獲取GET的時候已經作過一次urldecode,那麼爲什麼獲得值仍是中國呢 ?
緣由是urldecode('中國')的值就是中國.
因此若是咱們程序中若是有如下的代碼的話
$a = urldecode($_GET['a']);的時候其實咱們已經不經意間作了2次urldecode ------>這一點請務必注意
爲什麼我特別指出咱們要注意這個問題呢?
主要是我作的項目不少須要微信受權,而受權服務的接口每每提供成以下的格式
我如下面的場景爲例來講明問題
先來看調用端的狀況,調用的代碼應該是怎麼寫的
假如說
如如下的形式
因此咱們按照如下2步進行處理後,將值傳入redirect
第一步 將callbackurl進行urlencode,形式以下:
第二步,將上面獲取到值再進行urlencode,形式以下:
假如說 在程序中有如下的代碼
$redirect = urldecode($_GET['redirect']);
那麼問題就發生了.
因此 咱們必需要要將上面的代碼中urldecode去掉
因爲我在工做中發生過這樣的錯誤.特別在這裏記錄一下.以避免遺忘.
以上都是個人一些猜想.可是經過這個理解,也能說明一些問題.因此我認爲個人這個猜想是正確的.若是有誰有更好的解釋,那麼也請告訴我.謝謝