2013-11-15 44 views
11

我有一个PHP代码,需要将DB表数据编码为json。 所以我用json_encode()。php 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'";也不会返回任何内容。

相似的“不适用”,“自动对焦”不起作用,其他人工作完美。

我很奇怪这种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);来了解它。
我从中得到了以下输出。

如果我尝试'欧盟',我得到这个数组。

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”。

有谁知道如何解决这个问题? 如果是这样,请告诉我..

+1

我想,问题是“ÅlandIslands”,因为json_encode与“Å”有关的问题是一个奇怪的unicode。 试试你mysql_connection设置为UTF-8 –

回答

24

你应该确保你的web应用程序的每个组件都使用UTF-8。从另一个问题This answer会告诉你如何做到这一点。如果您从RFC4627获得read this

编码:JSON文本应以Unicode编码。默认编码是UTF-8。

json_encode函数要求所有传入数据都是UTF-8编码。这就是为什么字符串如Åland Islands可能会导致你的问题。

+4

感谢您在2分钟内你的快速反应.. 我接着说:mysqli_set_charset($ CON, 'utf-8');' 它完美... – vsriram92

13

这里只是一个随机猜测:json_encode要求您输入的所有数据为UTF-8编码为,否则将会失败。在这些失败的国家,您可能拥有包含非ASCII字符的数据。纯ASCII恰好与您需要特别照顾的UTF-8,非ASCII字符兼容。有关如何从数据库中获取UTF-8编码数据的信息,请参见UTF-8 all the way through(使用mysqli_set_charset)。

+5

谢谢。 我添加'mysqli_set_charset($ con,'utf8');' 它工作完美... – vsriram92

+0

谢谢,我刚刚在我准备好的声明中添加了以下代码:$ db-> set_charset(“utf8”);' –