json_encode возвращает ПУСТОЙ УКАЗАТЕЛЬ?

По некоторым причинам возвраты "описания" объекта 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"}]

Какие-либо идеи?

117
задан hakre 29 October 2011 в 11:55
поделиться

3 ответа

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

.
254
ответ дан 24 November 2019 в 02:00
поделиться

Если у вас есть хотя бы 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, вам не повезло, нет возможности узнать, в чем была ошибка.

.
117
ответ дан 24 November 2019 в 02:00
поделиться

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

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

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

Perhpas там есть какие-то специальные символы, которые набирают обороты...

.
4
ответ дан 24 November 2019 в 02:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: