По какой-то причине "описание" элемента возвращается 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"}]
Любые идеи?
$r['description']
пределами оператора for ()?Ответы:
Бьюсь об заклад, вы получаете данные в кодировке, отличной от 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) идентификаторы:
Они могут измениться в будущих версиях, поэтому лучше обратиться к руководству.
Если у вас ниже 5,3, вам не повезло, нет возможности спросить, в чем была ошибка.
источник
Anwser ntd не решил мою проблему. Для тех, кто находится в такой же ситуации, вот как я, наконец, справился с этой ошибкой: просто utf8_encode для каждого из ваших результатов.
Надеюсь, поможет!
источник
несколько дней назад у меня ТАКАЯ проблема с 1 таблицей.
Сначала попробуйте:
Если последняя строка возвращает 5, проблема связана с вашими данными . Я знаю, что у вас таблицы в UTF-8, но не введенные данные . Например, ввод был в текстовом файле, но создан на машине Win с глупой кодировкой (в моем случае Win-1250 = CP1250), и эти данные были введены в БД.
Решение? Найдите новые данные (Excel, веб-страницу), отредактируйте исходный текстовый файл через PSPad (или что-то еще), измените кодировку на UTF-8 , удалите все строки и теперь поместите данные из оригинала. Сохранить. Войдите в БД .
Вы также можете изменить кодировку только на utf-8, а затем вручную изменить все строки (укажите столбцы со специальными символами - desc, ...). Хорошо для рабов ...
источник
JSON_PARTIAL_OUTPUT_ON_ERROR
опцию, чтобы увидеть проблему (например, поле с UTF8 будет пустым).Вы должны передать строку в кодировке utf8 в json_encode. Вы можете использовать
utf8_encode
иarray_map()
работать, как показано ниже:источник
AHHH !!! Это выглядит так неправильно, что у меня болит голова. Попробуйте что-нибудь подобное ...
mysql_num_rows
вы должны использовать<
not<=
. Вы также должны кэшировать это значение (сохранить его в переменной) вместо того, чтобы пересчитывать его каждый цикл. Кто знает, что он делает под капотом ... (может быть эффективным, я не совсем уверен)mysql_fetch_array
возвращает значения как by, такkey
и byint
. Вы не используете индексы, поэтому не выбирайте их.Если это действительно проблема
json_encode
, то могу ли я предложить заменить тело цикла чем-то вродеВозможно, там есть некоторые особые символы, которые все портят ...
источник
null
null
то, вероятно, так и естьnull
. Попробуйтеecho $row['description'].'<br/>';
в этом цикле и посмотрите, что он говорит.Рекомендуемый PHP.net способ установки кодировки теперь следующий:
mysqli_set_charset ( 'utf8')
источник
Для всех, кто использует PDO, решение аналогично ответу ntd .
Со страницы конструкции PHP PDO :: __ в качестве комментария пользователя Kiipa в live dot com :
источник
Для меня проблема, при которой json_encode возвращала нулевую кодировку сущности, заключалась в том, что моя реализация jsonSerialize извлекала целые объекты для связанных сущностей; Я решил проблему, убедившись, что я получил идентификатор связанной / связанной сущности и вызвал -> toArray (), когда с объектом для сериализации json было связано несколько сущностей. Обратите внимание, я говорю о случаях, когда one
implements JsonSerializable
on entity.источник
У меня была такая же проблема, и я решил использовать мою собственную функцию вместо
json_encode()
источник