Solucionado (ver solução)
Solucionado
(ver solução)
13
respostas

Select com problemas por causa de acento

Olá! Estou fazendo um programa em PHP/Laravel e fui fazer uma consulta, e ela estava funcionando, até encontrar um campo, no caso o de Guaraná, onde por causa do acento, a pesquisa retorna como falsa.

$router->post('/testeproduto', function(Request $request) {
    if(!$request->isJson()) {
        return response()->json(["results" => [], "status" => 0, "message" => "This request isn't a JSON request."]);
    }
    $id = $request->json()->get('grupo');
    $results = DB::select('SELECT CODIGO, DESCRICAO, PRECO FROM TABELA WHERE GRUPO = :id', ['id' => $id]);
    ($results) ? $statusCode = 1 : $statusCode = 0;
    $statusCode = 1;
    ($statusCode) ? $mensagem = "Produto encontrado com sucesso." : $mensagem =  "Produto não encontrado.";
    return response()->json(["results" => json_encode($results), "status" => $statusCode, "message" => "Produto get successfully."]);
});

Ele me retorna esse erro

    "results": false,
    "status": 1,
    "message": "Produto get successfully."
13 respostas

Olá Matheus!

Acho que vamos ter que fazer alguns testes para entender o que está acontecendo. Para facilitar na visualização de erros e do debug adiciona por favor essa nova rota/função de teste e acessa ela pelo navegador:

$router->post('/aaa', function(Request $request) {
    $id = $request->get('grupo');
    $results = DB::select('SELECT CODIGO, DESCRICAO, PRECO FROM TABELA WHERE GRUPO = :id', ['id' => $id]);

    dump($id);
    dump($results);
});

Eu apenas copiei as partes referentes a busca e adicionei um dump pra gente poder ver o conteúdo de $resultado e $id

Mostra aqui qual é o resultado do teste com uma consulta que estava funcionando e com a consulta que não funcionou. Você pode tirar prints e fazer upload no imgur e compartilhar o link aqui.

Como segundo teste, se você tiver acesso ao banco de dados, excuta a query diretamente no banco: SELECT CODIGO, DESCRICAO, PRECO FROM TABELA WHERE GRUPO = 'grupo'

Olá Lucas! Obrigado pela resposta!

Fiz o teste que você pediu com a nova rota e deu esses erros aqui no navegador... https://prnt.sc/x599iv

Já no banco de dados, fiz a consulta e deu nisso: https://prnt.sc/x5947g Pode ver que no guaraná, o caractere é trocado por outro...

Quando puxo ele no código com um print_r, ele não me retorna somente o falso, imprime o resultado em array porém com um erro de falso lá em baixo...

Ah, realmente parece ser alguma diferença de encoding entre o laravel e o valor do banco.

Repete por favor o primeiro teste, esse erro que apareceu na verdade foi culpa minha, para acessar pelo navegador a rota deve ser do tipo get e não post, então deixa o início assim $router->get e testa novamente.

Compartilha por favor também mais informações sobre o banco que você está utilizando, se é mysql, postgresql ou outro.

Olá lucas, é um banco de dados em firebase FDB!

O resultado foi esse...

https://prnt.sc/x5frkh

Quando eu especifico o grupo, ele me retorna certo, porém não apresenta o erro de UTF-8 no item que está dando erro...

https://prnt.sc/x5g7wn

Ah, entendi.

Já peço desculpas mas vamos precisar de mais alguns testes para entender o que pode estar acontecendo.

Na imagem anterior (Imagem DB) as colunas selecionadas estão com o nome diferente do que você utiliza no código, CODIGO e CODM por exemplo, isso foi uma alteração apenas no código compartilhado aqui correto?

Além disso mostra quais são os valores dessa coluna GRUPO, pelo menos o valor da linha do Guaraná e outro valor que deu certo na consulta.

Opa, acabei mandando a mensagem anterior sem ver a sua última mensagem, então pelo meu código de teste está funcionando?

Estou suspeitando do json_encode então, quando ele não consegue fazer a conversão retorna false

Sim, está funcionando! O problema é quando puxo ali no php mesmo, no banco de dados me retorna com o acento ali.

E sim, os campos ali estão diferentes pq mudei pra ficar mais didático aqui...

Ah certo, vamos testar o json_encode() então.

Troca o código de teste para esse e compartilha o resultado:

$router->get('/aaa', function(Request $request) {
    $id = $request->get('grupo');
    $results = DB::select('SELECT CODIGO, DESCRICAO, PRECO FROM TABELA WHERE GRUPO = :id', ['id' => $id]);

    dump($id);
    dump($results);
    dump(json_encode($results));
    dump(json_last_error_msg());
});

Deu falso e o erro também...

https://prnt.sc/x5irmr

Faz mais uns testes com essas opções no json_encode()

Teste 1:

dump($id);
dump($results);
dump(json_encode($results, JSON_UNESCAPED_UNICODE|JSON_INVALID_UTF8_IGNORE));
dump(json_last_error_msg());

Teste 2:

dump($id);
dump($results);
dump(json_encode($results, JSON_PARTIAL_OUTPUT_ON_ERROR));
dump(json_last_error_msg());

Com o teste 1, ele retirou o Á e funcionou. https://prnt.sc/x5lmiy

Já com o teste 2 continuou o erro. https://prnt.sc/x5lpqt

Creio que com isso resolva, obrigado pela ajuda!

solução!

Sem problemas Matheus!

Acho que agora você pode fazer uma função ou um for para ir em cada item do array e fazer a conversão para utf8, assim não é perdido nenhum caractere na transformação para json. Nesse ponto aproveita para aplicar um trim() e remover esses espaços extras.

Qualquer coisa é só falar!