Por algum motivo, o item "descrição" retorna NULL
com o seguinte código:
<?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);
?>
Aqui está o esquema para meu banco de dados:
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
Aqui está o que é ecoado na página:
[{"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"}]
Alguma ideia?
$r['description']
fora da instrução for ()?Respostas:
Aposto que você está recuperando dados em codificação não utf8: tente colocar
mysql_query('SET CHARACTER SET utf8')
antes da suaSELECT
consulta.fonte
Se você possui pelo menos o PHP 5.5, pode usar json_last_error_msg () , que retornará uma string descrevendo o problema.
Se você não possui o 5.5, mas está acima / 5.3, pode usar json_last_error () para ver qual é o problema.
Ele retornará um número inteiro, que você pode usar para identificar o problema na documentação da função . Atualmente (01.01.2012), os identificadores são:
Isso pode mudar em versões futuras, por isso é melhor consultar o manual.
Se você está abaixo de 5,3, está sem sorte, não há como perguntar qual foi o erro.
fonte
A resposta do ntd não resolveu meu problema. Para aqueles na mesma situação, eis como eu finalmente lidei com esse erro: Apenas utf8_encode cada um dos seus resultados.
Espero que ajude!
fonte
alguns dias atrás eu tenho o mesmo problema com 1 tabela.
Primeiro tente:
Se a última linha retornar 5, o problema está nos seus dados . Eu sei, suas tabelas estão em UTF-8, mas não inseriram dados . Por exemplo, a entrada estava no arquivo txt, mas foi criada na máquina Win com codificação estúpida (no meu caso, Win-1250 = CP1250) e esses dados foram inseridos no banco de dados.
Solução? Procure novos dados (excel, página da web), edite o arquivo txt de origem via PSPad (ou qualquer outra coisa), altere a codificação para UTF-8 , exclua todas as linhas e agora coloque os dados do original. Salve . Entre no DB .
Você também pode alterar a codificação apenas para utf-8 e, em seguida, alterar todas as linhas manualmente (dê às colunas caracteres especiais - desc, ...). Bom para escravos ...
fonte
JSON_PARTIAL_OUTPUT_ON_ERROR
opção para ver o problema (por exemplo, o campo com UTF8 será nulo).Você deve passar a string codificada utf8 em json_encode. Você pode usar
utf8_encode
earray_map()
funcionar como abaixo:fonte
AHHH!!! Isso parece tão errado que machuca minha cabeça. Tente algo mais como este ...
mysql_num_rows
você<
não deve usar<=
. Você também deve armazenar em cache esse valor (salve-o em uma variável) em vez de recontar cada loop. Quem sabe o que está fazendo sob o capô ... (pode ser eficiente, não tenho muita certeza)mysql_fetch_array
retorna os valores porkey
e porint
. Você não está usando os índices, então não os busque.Se isso realmente é um problema
json_encode
, posso sugerir a substituição do corpo do loop por algo comoPerhpas, existem alguns caracteres especiais que estão sujando as coisas ...
fonte
null
null
, provavelmente estánull
. Tenteecho $row['description'].'<br/>';
nesse loop e veja o que diz.A maneira recomendada pelo PHP.net de definir o conjunto de caracteres agora é esta:
mysqli_set_charset ('utf8')
fonte
Para quem usa o DOP, a solução é semelhante à resposta do ntd .
Na página de construção PHP PDO :: __ , como um comentário do usuário Kiipa em live dot com :
fonte
Para mim, um problema em que json_encode retornaria codificação nula de uma entidade foi porque minha implementação jsonSerialize buscou objetos inteiros para entidades relacionadas; Resolvi o problema, certificando-me de buscar o ID da entidade relacionada / associada e chamei -> toArray () quando havia mais de uma entidade associada ao objeto a ser serializado pelo json. Note, eu estou falando sobre casos em que um
implements JsonSerializable
em entidades.fonte
Eu tive o mesmo problema e a solução foi usar minha própria função em vez de
json_encode()
fonte