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);
}
留言
張貼留言