У меня есть PHP-код, который должен кодировать данные таблицы DB в 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);
,
Я получил от него следующий результат.
Если я попробую «ЕС», я получаю этот массив.
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».
Кто-нибудь знает, как решить эту проблему ? Если да, скажите мне, пожалуйста.
Вы должны убедиться, что каждый компонент вашего веб-приложения использует 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
).