字符丢失将_GET数组转换为URL字符串

时间:2013-06-21 15:02:12

标签: php

将$ _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测试用例!

3 个答案:

答案 0 :(得分:0)

您的数据一切正常。如果您这样做,可以进行验证:

$query = http_build_query($_GET);
parse_str($query, $data);
print_r($data);

您将获得正确的未损坏数据。

您看到¬符号的原因是浏览器如何解释html实体。 ¬表示为¬但是浏览器会在最后没有分号的情况下呈现它。

答案 1 :(得分:0)

您最有可能在网络浏览器中显示此数据并且正在解释

&not

作为特殊的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));