0

将 $_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=Super+Mario¬ify_version=3.7

案例 2):在与案例 1) 相同的脚本中使用,就在案例 1) 中保存之前:

// Script1.php

echo http_build_query($_GET);

结果:(不正确的输出)

address_country_code=GB&address_name=Super+Mario¬ify_version=3.7

在情况 2 中如何将几个字符输出为 ¬ 但情况 1 很好!这让我发疯:(

我也尝试过在 foreach 循环的键和值中使用 urlencode() 生成 url 的自定义函数,而不是使用 http_build_query,这只是导致在我的一个测试用例中将 ¬ 更改为 %C2%AC!

4

3 回答 3

0

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

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

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

您看到符号的原因¬是浏览器如何解释 html 实体。¬ 表示为¬但浏览器将呈现它,即使最后没有分号。

于 2013-06-21T15:24:45.193 回答
0

因此,即使这两种情况都将 Web 浏览器输出到 Web,并且都使用 http_build_query() 从数组转换。

我通过用这个函数替换 http_build_query 解决了案例 2 中的问题(案例 1 仍然使用它..):

htmlspecialchars(http_build_query($_GET));
于 2013-06-21T15:59:43.877 回答
0

您很可能在 Web 浏览器中显示此数据,这就是解释

&not

作为特殊的 HTML 实体。

请看这个:https ://code.google.com/p/doctype-mirror/wiki/NotCharacterEntity

尝试做

var_dump(http_build_query($_GET))

代替:

echo http_build_query($_GET)

并查看 HTML 源代码以获取/验证实际字符串。

于 2013-06-21T15:28:24.907 回答