По какой-то причине элемент «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 <=
. Вы также должны кэшировать это значение (сохранить его в переменной), а не перечитывать каждый цикл. Кто знает, что он делает под капотом … (может быть, я эффективен, я не уверен) 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) . '"]';