将$ _GET请求转换为字符串有一个非常奇怪的问题。 (PHP 5.2.17)
以下是print_r()的数组问题区域的一小部分:
_GET (array)
...
[address_country_code] => GB
[address_name] => Super Mario
[notify_version] => 3.7
...
有两种情况使用_GET数据:
案例1):已保存,稍后再使用:
// Script1.php
$data = json_encode($_GET);
# > Save to MySQL Database ($data)
// Script2.php (For Viewing & Testing URL later)
# > Load from Database ($result)
echo http_build_query(json_decoded($result,true));
以上数组摘录的结果:(正确输出)
address_country_code = GB&安培; ADDRESS_NAME =超级+马里奥与安培; notify_version = 3.7
案例2):在案例1中保存之前用于与案例1相同的脚本中):
// Script1.php
echo http_build_query($_GET);
结果:(INCORRECT OUTPUT)
address_country_code = GB&安培; ADDRESS_NAME =超级+Mario¬ify_version= 3.7
在案例2中如何将一些字符作为¬输出怎么可能呢?案例1没问题! 这让我疯了:(
我也尝试过使用http_build_query而不是使用自定义函数,该函数使用foreach循环的Key和Value中的urlencode()生成url,这只会导致我在其中一个中更改为%C2%AC测试用例!
答案 0 :(得分:0)
您的数据一切正常。如果您这样做,可以进行验证:
$query = http_build_query($_GET);
parse_str($query, $data);
print_r($data);
您将获得正确的未损坏数据。
您看到¬
符号的原因是浏览器如何解释html实体。 ¬表示为¬
但是浏览器会在最后没有分号的情况下呈现它。
答案 1 :(得分:0)
您最有可能在网络浏览器中显示此数据并且正在解释
¬
作为特殊的HTML实体。
请看:https://code.google.com/p/doctype-mirror/wiki/NotCharacterEntity
尝试
var_dump(http_build_query($_GET))
而不是:
echo http_build_query($_GET)
并查看HTML源以获取/验证实际字符串。
答案 2 :(得分:0)
所以,即使这两种情况都输出到web浏览器,并且都使用http_build_query()从数组转换。
我通过用这个函数替换http_build_query(案例1仍然使用它......)修复了案例2中的问题:
htmlspecialchars(http_build_query($_GET));