Z jakiegoś powodu pozycja „opis” wraca NULL
z następującym kodem:
<?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);
?>
Oto schemat mojej bazy danych:
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
Oto, co jest echem na stronie:
[{"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"}]
Jakieś pomysły?
$r['description']
poza instrukcją for ()?Odpowiedzi:
Założę się, że pobierasz dane w kodowaniu innym niż utf8: spróbuj umieścić je
mysql_query('SET CHARACTER SET utf8')
przedSELECT
zapytaniem.źródło
Jeśli masz co najmniej PHP 5.5, możesz użyć json_last_error_msg () , która zwróci napis opisujący problem.
Jeśli nie masz wersji 5.5, ale jesteś na / powyżej 5.3, możesz użyć json_last_error (), aby zobaczyć, w czym tkwi problem.
Zwróci liczbę całkowitą, której możesz użyć do zidentyfikowania problemu w dokumentacji funkcji . Obecnie (2012.01.19) identyfikatory to:
Mogą się one zmienić w przyszłych wersjach, więc lepiej zapoznać się z instrukcją.
Jeśli jesteś poniżej 5,3, nie masz szczęścia, nie ma możliwości spytania o błąd.
źródło
ntd's anwser nie rozwiązał mojego problemu. Dla tych w tej samej sytuacji, oto jak w końcu poradziłem sobie z tym błędem: Po prostu utf8_encode każdy z wyników.
Mam nadzieję, że to pomoże!
źródło
kilka dni temu mam TEN SAM problem z 1 stolikiem.
Najpierw spróbuj:
Jeśli ostatnia linia zwraca 5, problem dotyczy twoich danych . Wiem, twoje tabele są w UTF-8, ale nie wprowadzono danych . Na przykład dane wejściowe były w pliku txt, ale utworzone na maszynie Win z głupim kodowaniem (w moim przypadku Win-1250 = CP1250) i te dane zostały wprowadzone do bazy danych.
Rozwiązanie? Poszukaj nowych danych (Excel, strona internetowa), edytuj źródłowy plik txt przez PSPad (lub cokolwiek innego), zmień kodowanie na UTF-8 , usuń wszystkie wiersze i umieść dane z oryginału. Zapisać. Wejdź do DB .
Możesz także zmienić tylko kodowanie na utf-8, a następnie ręcznie zmienić wszystkie wiersze (podaj cols ze specjalnymi znakami - desc, ...). Dobre dla niewolników ...
źródło
JSON_PARTIAL_OUTPUT_ON_ERROR
opcji, aby zobaczyć problem (np. pole z UTF8 będzie puste).Powinieneś przekazać zakodowany ciąg utf8 w json_encode. Możesz używać
utf8_encode
iarray_map()
funkcjonować jak poniżej:źródło
AHHH !!! To wygląda tak źle, że boli mnie głowa. Spróbuj czegoś bardziej podobnego ...
mysql_num_rows
należy użyć<
nie<=
. Powinieneś także buforować tę wartość (zapisać ją w zmiennej) zamiast ponownie liczyć każdą pętlę. Kto wie, co robi pod maską ... (może być wydajne, nie jestem pewien)mysql_fetch_array
zwraca wartości zarówno przez, jakkey
i przezint
. Nie używasz indeksów, więc ich nie pobieraj.Jeśli naprawdę jest z tym problem
json_encode
, to czy mogę zasugerować wymianę korpusu pętli na coś podobnegoMoże są tam jakieś specjalne znaki, które wszystko psują ...
źródło
null
null
to prawdopodobnie taknull
. Spróbujecho $row['description'].'<br/>';
w tej pętli i zobacz, co mówi.Zalecany przez PHP.net sposób ustawiania zestawu znaków jest następujący:
mysqli_set_charset („utf8”)
źródło
Dla każdego, kto używa PDO, rozwiązanie jest podobne do odpowiedzi ntd .
Ze strony PHP PDO :: __ construct , jako komentarz od użytkownika Kiipa na live dot com :
źródło
Dla mnie problem polegający na tym, że json_encode zwróciłby kodowanie null jednostki, był taki, że moja implementacja jsonSerialize pobierała całe obiekty dla powiązanych jednostek; Rozwiązałem problem, upewniając się, że pobrałem identyfikator powiązanej / skojarzonej jednostki i wywołałem -> toArray (), gdy istniało więcej niż jedna jednostka skojarzona z obiektem do serializacji json. Uwaga, mówię o przypadkach, w których jeden dotyczy
implements JsonSerializable
podmiotów.źródło
Miałem ten sam problem i rozwiązaniem było użycie własnej funkcji zamiast
json_encode()
źródło