JSON encode возвращает NULL?


Почему-то пункт "описание" возвращает NULL следующий код:

<?php
include('db.php');

$result = mysql_query('SELECT * FROM `staff` ORDER BY `id` DESC LIMIT 2') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>

вот схема для моей базы данных:

CREATE TABLE `staff` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` longtext COLLATE utf8_unicode_ci,
  `description` longtext COLLATE utf8_unicode_ci,
  `icon` longtext COLLATE utf8_unicode_ci,
  `date` longtext COLLATE utf8_unicode_ci,
  `company` longtext COLLATE utf8_unicode_ci,
  `companyurl` longtext COLLATE utf8_unicode_ci,
  `appurl` longtext COLLATE utf8_unicode_ci,
  PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci

вот что отражается на странице:

[{"id":"4","name":"Noter 2","description":null,"icon":"http://images.apple.com/webapps/productivity/images/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http://dbelement.com/","appurl":"http://noter2.dbelement.com"},{"id":"3","name":"Noter 2","description":null,"icon":"http://images.apple.com/webapps/productivity/images/noter2_20091223182720-thumb.jpg","date":"1262032317","company":"dBelement, LLC","companyurl":"http://dbelement.com/","appurl":"http://noter2.dbelement.com"}]

какие идеи?

10 114

10 ответов:

бьюсь об заклад, вы получаете данные в кодировке не utf8: попробуйте поставить mysql_query('SET CHARACTER SET utf8') перед SELECT запрос.

Если у вас есть хотя бы PHP 5.5, вы можете использовать json_last_error_msg (), который вернет строку, описывающую проблему.

Если у вас нет 5.5, а дальше/выше 5.3, вы можете использовать json_last_error () посмотреть в чем проблема.

он вернет целое число, которое можно использовать для идентификации проблемы в функции. В настоящее время (2012.01.19), идентификаторы являются:

0 = JSON_ERROR_NONE
1 = JSON_ERROR_DEPTH
2 = JSON_ERROR_STATE_MISMATCH
3 = JSON_ERROR_CTRL_CHAR
4 = JSON_ERROR_SYNTAX
5 = JSON_ERROR_UTF8

они могут изменение в будущих версиях, так что лучше проконсультироваться с руководством.

Если вы ниже 5.3, вам не повезло, нет никакого способа спросить, в чем была ошибка.

anwser ntd не решил мою проблему. Для тех, кто в той же ситуации, вот как я, наконец, обработал эту ошибку: Просто utf8_encode каждый из ваших результатов.

while($row = mysql_fetch_assoc($result)){
    $rows[] = array_map('utf8_encode', $row);
}

надеюсь, что это помогает!

несколько дней назад у меня такая же проблема с 1 стол.

во-первых попробовать:

echo json_encode($rows);
echo json_last_error();  // returns 5 ?

если последняя строка возвращает 5, проблема с вашими данными. Я знаю, ваши таблицы в UTF-8, но не введены данные. Например вход был в txt файл, но создан на Win машине с тупой кодировкой (в моем случае Win-1250 = CP1250) и эти данные были введены в БД.

решение? Ищите новые данные (excel, web page),изменить исходный текстовый файл через PSPad (или что-то еще),изменить кодировку на UTF-8, удалите все строки и теперь поместите данные из оригинала. Спасать. войдите в DB.

вы также можете изменить кодировку только на utf-8, а затем изменить все строки вручную (дайте cols со специальными символами - desc,...). Хорошо для рабов...

вы должны передать кодированную строку utf8 в json_encode. Вы можете использовать utf8_encode и array_map() функция, как показано ниже:

<?php
    $encoded_rows = array_map('utf8_encode', $rows);
    echo json_encode($encoded_rows);
?>

ААААА!!! Это выглядит так неправильно, что у меня болит голова. Попробуй что-нибудь вроде этого...

<?php
include('db.php');

$result = mysql_query('SELECT `id`, `name`, `description`, `icon` FROM `staff` ORDER BY `id` DESC LIMIT 20') or die(mysql_error());
$rows = array();
while($row = mysql_fetch_assoc($result)){
    $rows[] = $row;
}

echo json_encode($rows);
?>
  • при переборе mysql_num_rows вы должны использовать < не <=. Вы также должны кэшировать это значение (сохранить его в переменную) вместо того, чтобы пересчитывать каждый цикл. Кто знает, что он делает под капотом... (может быть эффективным, я не совсем уверен)
  • вам не нужно явно копировать каждое значение... ты просто все усложняешь. себе. Если запрос возвращает больше значений, чем вы там указали, перечислите только те, которые вы хотите в своем SQL.
  • mysql_fetch_array возвращает значения как key и int. Вы не используете индексы, поэтому не извлекайте их.

если это действительно проблема с json_encode, тогда я могу предложить заменить тело цикла чем-то вроде

$rows[] = array_map('htmlentities',$row);

возможно, там есть какие-то специальные символы, которые все портят...

PHP.net рекомендуемый способ установки кодировки теперь таков:

mysqli_set_charset ('utf8')

для тех, кто использует PDO, решение похоже на ответ ntd.

с PHP PDO::_ _ construct page, как комментарий от пользователя Kiipa в live dot com:

чтобы получить кодировку UTF-8, вы можете указать это в DSN.

$link = new PDO ("mysql:host=localhost; dbname=DB;charset=UTF8");

для меня проблема, когда json_encode возвращал бы нулевую кодировку сущности, заключалась в том, что моя реализация jsonSerialize извлекала целые объекты для связанных сущностей; я решил проблему, убедившись, что я извлек идентификатор связанной/связанной сущности и вызвал ->toArray (), когда было более одной сущности, связанной с объектом, подлежащим сериализации json. Заметьте, я говорю о случаях, когда один implements JsonSerializable на лиц.

у меня была та же проблема, и решение состояло в том, чтобы использовать мою собственную функцию вместо json_encode()

echo '["' . implode('","', $row) . '"]';