По какой-то причине элемент "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);
?>
Вот схема для моей базы данных:
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"}]
Любые идеи?
Ответ 1
Держу пари, что вы извлекаете данные в кодировке, отличной от utf8: попробуйте поставить mysql_query('SET CHARACTER SET utf8')
перед запросом SELECT
.
Ответ 2
Если у вас есть хотя бы 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, вам не повезло, нет способа узнать, что это за ошибка.
Ответ 3
ntd anwser не решила мою проблему. Для тех, кто в той же ситуации, вот как я, наконец, справился с этой ошибкой:
Просто utf8_encode каждый из ваших результатов.
while($row = mysql_fetch_assoc($result)){
$rows[] = array_map('utf8_encode', $row);
}
Надеюсь, что это поможет!
Ответ 4
несколько дней назад у меня проблема с 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, удалите все строки и теперь установите данные из оригинала. Сохранить. Введите в DB.
Вы также можете изменить кодировку только на utf-8, а затем вручную изменить все строки (дать cols со специальными символами - desc,...). Хорошо для рабов...
Ответ 5
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
вы должны использовать <
not <=
. Вы также должны кэшировать это значение (сохранить его в переменной), а не перечитывать каждый цикл. Кто знает, что он делает под капотом... (может быть, я эффективен, я не уверен)
- Вам не нужно копировать каждое значение явно так... вы просто усложняете себя. Если запрос возвращает больше значений, чем вы там указали, укажите только те, которые вы хотите в своем SQL.
-
mysql_fetch_array
возвращает значения как key
, так и int
. Вы не используете индексы, поэтому не извлекайте их.
Если это действительно проблема с json_encode
, то я могу предложить заменить тело цикла чем-то вроде
$rows[] = array_map('htmlentities',$row);
В Perhpas есть некоторые специальные символы, которые удручают вещи...
Ответ 6
Вы должны передать utf8 закодированную строку в json_encode. Вы можете использовать функции utf8_encode
и array_map()
, как показано ниже:
<?php
$encoded_rows = array_map('utf8_encode', $rows);
echo json_encode($encoded_rows);
?>
Ответ 7
Рекомендуемый способ настройки charset в PHP.net:
mysqli_set_charset ('utf8')
Ответ 8
Для тех, кто использует PDO, решение похоже на ntd answer.
Из PHP PDO:: __ страница конструктора в качестве комментария от пользователя Kiipa в live dot com:
Чтобы получить кодировку UTF-8, вы можете указать это в DSN.
$link = new PDO ( "mysql: host = localhost; dbname = DB; charset = UTF8" );
Ответ 9
У меня была та же проблема, и решение заключалось в использовании моей собственной функции вместо json_encode()
echo '["' . implode('","', $row) . '"]';