作者 主題: 關於_GET變數的疑問  (閱讀 8769 次)

0 會員 與 1 訪客 正在閱讀本文。

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 於: 2007-09-22 09:34 »
代碼: [選擇]
<?//a.php
header ("Content-Type: text/html; charset=utf-8");
$var1=base64_encode("快速");
echo "<a href='b.php?var1={$var1}'>go</a>";
?>

代碼: [選擇]
<?//b.php
header ("Content-Type: text/html; charset=utf-8");
echo base64_decode($_GET[var1]);
?>

測試環境:php5.1.6
我從a.php傳送一個經base64編碼的var1變數到b.php, 可是在b.php接收並解碼後得到了亂碼?
在這個例子中, var1的base64編碼是5b+r6YCf, 可是接收到的是5b r6YCf, "+"不見了?!
我後來猜想是magic_quotes_gpc的關係, 可是不管是On還是Off, 結果都是一樣的...

於是我又換了一個版本php4.3.1,居然是可以得到正確結果 :lol: 傻眼~~

再來...我又改跑big5模式再回到php5.1.6去跑, 可以得到正確結果, 用utf-8就是不行!
那個"+"是我的問題點嗎?
請問是php設置的問題還是其它可能的原因?謝謝您~

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5411
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
關於_GET變數的疑問
« 回覆 #1 於: 2007-09-22 09:59 »
+ 在 URL 裡頭是保留字吧.
如果要用 url 來傳遞, 請用 urlencode() 處理過吧.

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #2 於: 2007-09-22 10:06 »
以前都是用urlencode確實沒發生過問題~

好奇的是這個"+"為什麼在php4.3.1可以, php5.1.6卻不行?
而且是utf-8才不行, big5又可以, 一直找不到答案, 很想知道原因 :lol:

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
關於_GET變數的疑問
« 回覆 #3 於: 2007-09-22 10:14 »
utf-8 跟 big5 字碼不同啊,

所以用 base64 編出來的碼就不一樣嘍~~

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #4 於: 2007-09-22 19:11 »
引述: "yamaka"
utf-8 跟 big5 字碼不同啊,

所以用 base64 編出來的碼就不一樣嘍~~

嗯~對喔 ! 我怎麼忘了 :oops:

那麼只剩下url裡面"+"的問題了,為什麼同樣的編碼在php4.3.1卻又可以行得通?

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
關於_GET變數的疑問
« 回覆 #5 於: 2007-09-23 12:20 »
引述: "joeyhsy"
引述: "yamaka"
utf-8 跟 big5 字碼不同啊,

所以用 base64 編出來的碼就不一樣嘍~~

嗯~對喔 ! 我怎麼忘了 :oops:

那麼只剩下url裡面"+"的問題了,為什麼同樣的編碼在php4.3.1卻又可以行得通?


你看一下 4.3.1 版送出資料後,

瀏覽器上顯示的資料是怎樣的  :roll:

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #6 於: 2007-09-23 23:10 »
引述: "yamaka"
你看一下 4.3.1 版送出資料後,

瀏覽器上顯示的資料是怎樣的  :roll:

就是正確的結果
快速

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
關於_GET變數的疑問
« 回覆 #7 於: 2007-09-23 23:40 »
我說的是 a.php $var1 的輸出 XD

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #8 於: 2007-09-24 01:24 »
引述: "yamaka"
我說的是 a.php $var1 的輸出 XD

5b+r6YCf  <==是說這個嗎?

Yamaka

  • 俺是博士!
  • *****
  • 文章數: 4913
    • 檢視個人資料
    • http://www.ecmagic.com
關於_GET變數的疑問
« 回覆 #9 於: 2007-09-24 09:58 »
引述: "joeyhsy"
引述: "yamaka"
我說的是 a.php $var1 的輸出 XD

5b+r6YCf  <==是說這個嗎?



對啦, 用4.3.1時,

a.php 在瀏覽器上那串字是是顯示怎樣,

然後在 b.php 解碼前, 又是什麼樣子 ??

可能是在哪一個環節有自動編、解碼的動作~~

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #10 於: 2007-09-24 21:28 »
引述: "yamaka"
對啦, 用4.3.1時,

a.php 在瀏覽器上那串字是是顯示怎樣,

然後在 b.php 解碼前, 又是什麼樣子 ??

可能是在哪一個環節有自動編、解碼的動作~~


在php4.3.1:
a.php==>5b+r6YCf
b.php==>5b+r6YCf

在php5.1.6:
a.php==>5b+r6YCf
b.php==>5b r6YCf

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #11 於: 2007-09-24 21:35 »
對不起, 有一點猜測想說明一下, 因為我一直覺得很可能跟php設置或版本有關, 而不是php碼...
因為在網址列呈現的結果, 不管是php431還是516都是?var1=5b+r6YCf
而程式碼是完全相同的, 卻得到不同結果 不知這樣猜測合不合理?

twu2

  • 管理員
  • 俺是博士!
  • *****
  • 文章數: 5411
  • 性別: 男
    • 檢視個人資料
    • http://blog.teatime.com.tw/1
關於_GET變數的疑問
« 回覆 #12 於: 2007-09-24 23:51 »
就說 + 是保留字了. 為什麼要在 URL 傳送的資料包含 + ?

你用  urlencode() 會把空白換成 + 號, 所以當你的 url 中有  + 號時, 經由 urldecode() 處理過後, 那個 + 就變成空白了.
http://tw2.php.net/manual/tw/function.urldecode.php
看一下裡頭的註解,  $_GET 是一個已經被 urldecode() 處理過的變數, 自然你使用時那個 + 會變成空白.

如果你認為 $_GET 不應該被 urldecode() 處理過... 那麼, 請問你, 當傳送的 URL 有中文, 使用 %dd 之類的編碼送來時, 為什麼你完全不用處理, 就可以得到正確的中文? 而不是那堆原始的 URL 內容?

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #13 於: 2007-09-25 02:09 »
引述: "twu2"
就說 + 是保留字了. 為什麼要在 URL 傳送的資料包含 + ?

謝謝 ! 經過您的指導, 我已經知道該怎麼正確處理$_GET的變數 :D

不知道是不是我表達錯誤, 或是沒搞懂各位前輩的引導, 我把我最後想知道的說簡潔一點,懇請不吝指導.

//on php 4.3.1
echo base64_decode("5b r6YCf");
輸出結果:快速

//on php 5.1.6
echo base64_decode("5b r6YCf");
輸出結果:庺`'

為什麼base64_decode同一個字串, 在兩個不同php版本得到不一的結果?

fillano

  • 鑽研的研究生
  • *****
  • 文章數: 526
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #14 於: 2007-09-25 07:47 »
引述: "joeyhsy"

謝謝 ! 經過您的指導, 我已經知道該怎麼正確處理$_GET的變數 :D

不知道是不是我表達錯誤, 或是沒搞懂各位前輩的引導, 我把我最後想知道的說簡潔一點,懇請不吝指導.

//on php 4.3.1
echo base64_decode("5b r6YCf");
輸出結果:快速

//on php 5.1.6
echo base64_decode("5b r6YCf");
輸出結果:庺`'

為什麼base64_decode同一個字串, 在兩個不同php版本得到不一的結果?


參考: http://tw.php.net/manual/en/function.base64-decode.php#69747

User Contributed Notes提到這個變更,但是據說change log沒有提到。

似乎5.0.5之前的版本假設空格就是+,然後就處理了。5.1.0之後的版本不做這個假設,所以結果不一樣。
Sapere aude! Habe Mut, dich deines eigenen Verstandes zu bedienen! ist also der Wahlspruch der Aufklärung.

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #15 於: 2007-09-25 08:06 »
引述: "fillano"
User Contributed Notes提到這個變更,但是據說change log沒有提到。

似乎5.0.5之前的版本假設空格就是+,然後就處理了。5.1.0之後的版本不做這個假設,所以結果不一樣。

明明就發現兩個版本解碼結果不同, 居然沒想到上官網去找答案, 汗~
呵呵~ 原來是php的變更, 終於知道原因了, 還一直以為是php的設置問題, 非常謝謝您 :D

ricky

  • 區域板主
  • 鑽研的研究生
  • *****
  • 文章數: 669
    • 檢視個人資料
    • Ricky 碎碎唸
關於_GET變數的疑問
« 回覆 #16 於: 2007-09-25 21:21 »
不同的編碼有不同的用途
根據樓主的敘述
您是想把編碼後的文字用在URL的變數傳遞
這時候請乖乖使用urlencode
base64是用來將binary的資料轉換成ascii純文字編碼的使用
看字面的64就知道他使用了ascii字元中的64個
a-z A-Z 0~9 +/ 這幾個字元作編碼
其中+在url中是有特殊用意代表"空白"字元
我的symfony作品:YOMOpets 寵物誌
有興趣可以一起來討論symfony喔
我的部落格:http://ricky.ez2.us/

joeyhsy

  • 活潑的大學生
  • ***
  • 文章數: 290
    • 檢視個人資料
關於_GET變數的疑問
« 回覆 #17 於: 2007-09-26 04:44 »
嗯嗯~
謝謝各位的幫忙, 以前在舊版的php有時候用base64, 有時候又用urlencode, 或rawurlencode,
以為沒問題就直覺用那種編碼都沒差, 一直沒去真正了解之間的差異和適用場合...
後來換了php5接踵的問題來了, 看來是我的習慣太不好, 還有很多要學習改進的地方,
在這裡真的學到不少, 再次感謝大家的耐心, 感恩 :D