PHP parse_str 遇到的問題



問題



parse_str 在解析+時的問題會解析成 ,但依據RFC 3986規範不應該這樣,應解析為+。



狀況



解析 QueryString 後拿到的值去做加密驗證時一直失敗。



解決



此方法無法處理含有陣列的QueryString // 等我有哪天無聊再來弄吧!!






改進了一個function達成。

從PHP 官方的討論中找出程式片段並改進



function parseQueryString($str) { 

$op = array();

$pairs = explode('&', $str);

foreach ($pairs as $pair) {

list($k, $v) = array_map('rawurldecode', explode('=', $pair));

$op[$k] = $v;

}

return $op;

}



因為rawurldecode不會將+換成



總結與心得



找查許久之後才發現parse_str在解析QueryString會對其值做urldecode(),而、PHP對+做urldecode()時會轉換成 ,但是依據RFC 3986規範應解析成+於是使用rawurldecode()代替。



下次再做加解密時若有用到 parse_str 或是 urlencode/urldecode 時要注意來源或目的的url加密格式(主要差別在於+是轉換成 還是 )。



補充



取代http_build_query // 也是用urlencode



function buildQueryString(array $arr) {

$op = array();

foreach ($arr as $key => $val) {

list($k, $v) = array_map('rawurlencode', array($key, $val));

array_push($op, "{$k}={$v}");

}

return implode('&', $op);

}














留言

這個網誌中的熱門文章

成人剪舌繫帶聽過嗎?我剪了!!

Scp - ssh 的遠端檔案傳輸指令

睡覺使你更有效率