http_build_query是用來產生URL請求字串的函數,很簡單.不過今天卻出現了一點小意外,在本機安裝公司社區時,出現了無法登入的情況.但在測試伺服器正常.經過地毯式排錯誤,找到問題代碼(僅演示,屏蔽敏感內容):
[coolcode lang=”php”]
$Args = array(
“usr” => “touchboy”,
“pwd” => “123456”,
“ip” => “127.0.0.1”,
“src” => “account”
);
$query= http_build_query( $Args );
[/coolcode]
測試伺服器得到結果為=123456&ip=127.0.0.1&src=account
而我本地結果為:
usr=touchboy &pwd=123456 &ip=127.0.0.1 &src=account
中間的連接符出現了差異,伺服器為正常的」&”本地卻是轉義後的”&”,最終導致本地提交資料錯誤.
查看手中的PHP手冊,http_build_query一節對此問題隻字未提.所以想到的補救方法就只有用htmlspecialchars_decode($query)還原連接符號.不過始終覺得可疑,為什麼兩台機子結果不一樣.開始懷疑是linux(伺服器)和windows(本機)的差異,但經過對另一台windows機子的測試,結果正常.後就懷疑是環境配置的問題,經過一番google,果然真相大白.問題元兇在php.ini配置中一行:
[coolcode lang=”php”]arg_separator.output = “&”[/coolcode]
將arg_separator.output定義為”&”,重啟apache,問題解決!
順帶說下PHP手冊的問題,因我用的手冊是之前比較經典的《PHP5中文手冊文檔版》(2006-11-05編譯),2年半以前的東東,內容應該停留在PHP 5.1.0的階段.很多內容已經滯後了.之後下載了陳浩(Haohappy)的《PHP中文手冊》(2009-02-15編譯),查看http_build_query一節,發現裡面出現一行相關提示:
[coolcode lang=”php”]
Note: 用arg_separator.output 來分隔參數。 [/coolcode]
到官方查看最新手冊,發現裡面有更詳盡闡述,說明在5.1.2版增加了$arg_separator 參數可以解決此問題.看來中文的手冊滯後還是很嚴重,5.1.2應該是一年前發布的,而2009-02-15編譯的最新中文手冊仍未收錄相關內容.
簡而言之,遇到PHP函數故障,節省時間的最好解決方法:
1.第一時間到PHP官方查找答案.
2.保證自己手中的PHP手冊是最新的.