我有一个PHP代码,需要将数据库表数据编码为json。所以我用了json_encode()。
我使用这里给出的表格 - http://www.geekality.net/2011/08/21/country-names-continent-names-and-iso-3166-codes-for-mysql/
对于不同的输入,此代码的行为似乎有所不同。
查询 - $query = "SELECT * FROM countries ";
不返回任何 json 值。
查询 - $query = "SELECT * FROM countries where continent_code='AS'";
正确返回 json 值。
然而,$query = "SELECT * FROM countries where continent_code='EU'";
也不会返回任何内容。
同样,"NA","AF"不起作用,而其他工作完美。
我对PHP json_encode的这种行为感到奇怪。
这是我的代码。
<?php
$con=mysqli_connect('localhost','xxxx','xxxxx','joomla30');
// Check connection
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$result = mysqli_query($con,"SELECT * FROM countries where continent_code='EU'") or die (mysqli_error($con));
while ($row = mysqli_fetch_array($result, MYSQLI_ASSOC)) {
$orders[] = array(
'CountryCode' => $row['code'],
'CountryName' => $row['name']
);
}
//print_r($orders);
echo json_encode($orders);
mysqli_close($con);
?>
在上一行json_encode之前,将携带数据。所以我认为它的 json 编码问题。
我试图使用print_r($orders);
来了解它。
我从中得到了以下输出。
如果我尝试"EU",我会得到这个数组。
Array ( [0] => Array ( [CountryCode] => AD [CountryName] => Andorra )
[1] => Array ( [CountryCode] => AL [CountryName] => Albania )
[2] => Array ( [CountryCode] => AT [CountryName] => Austria )
[3] => Array ( [CountryCode] => AX [CountryName] => Åland Islands )...
如果我尝试"AS",我会得到这个数组。
Array ( [0] => Array ( [CountryCode] => AE [CountryName] => United Arab Emirates )
[1] => Array ( [CountryCode] => AF [CountryName] => Afghanistan)
[2] => Array ( [CountryCode] => AM [CountryName] => Armenia)
[3] => Array ( [CountryCode] => AZ [CountryName] => Azerbaijan)...
两个数组看起来很相似...但Json_encode仅适用于"AS",而不适用于"EU"。
有谁知道如何解决这个问题?如果是这样,请告诉我..
您应该确保 Web 应用程序的每个组件都使用 UTF-8。另一个问题的答案将告诉您如何做到这一点。如果您从RFC4627阅读以下内容:
编码:JSON 文本应以 Unicode 编码。 默认编码为 UTF-8。
json_encode函数要求所有传入数据都采用 UTF-8 编码。这就是为什么像Åland Islands
这样的字符串可能会给你带来问题。
这里只是一个随机猜测:json_encode
要求您输入的所有数据都采用 UTF-8 编码,否则它将失败。在失败的这些国家/地区,您可能拥有包含非 ASCII 字符的数据。纯 ASCII 恰好与 UTF-8 兼容,您需要特别注意的非 ASCII 字符。请参阅 UTF-8 始终了解如何从数据库中获取 UTF-8 编码数据(使用 mysqli_set_charset
)。