問題 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); }