json_encode возвращает NULL?

По какой-то причине элемент «description» возвращает 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); ?> в <?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"}] 

Есть идеи?

Бьюсь об заклад, вы извлекаете данные в кодировке non-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, вам не повезло, нет способа узнать, что такое ошибка.

ntd's anwser не решила мою проблему. Для тех, кто в той же ситуации, вот как я, наконец, справился с этой ошибкой: Just 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), редактируйте исходный txt-файл через PSPad (или что-то еще), измените кодировку на UTF-8 , удалите все строки и теперь поместите данные из оригинала. Сохранить. Войдите в БД .

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

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

 <?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); ?> в <?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 вы должны использовать < not <= . Вы также должны кэшировать это значение (сохранить его в переменной), а не перечитывать каждый цикл. Кто знает, что он делает под капотом … (может быть, я эффективен, я не уверен)
  • Вам не нужно копировать каждое значение явно так … вы просто усложняете себя. Если запрос возвращает больше значений, чем вы там указали, укажите только те, которые вы хотите в своем SQL.
  • mysql_fetch_array возвращает значения как key и int . Вы не используете индексы, поэтому не извлекайте их.

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

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

В Perhpas есть некоторые специальные символы, которые забрасывают вещи …

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

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

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

mysqli_set_charset ( 'utf8')

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

На странице создания PHP PDO :: __ в качестве комментария от пользователя Kiipa в live dot com :

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

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

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

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