Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

brunitto

[Resolvido]  PHP + mysqli + charset

Recommended Posts

[Resolvido]

 

Olá a todos...

 

Tenho um documento PHP que insere um cliente em uma tabela MySQL, utilizando a class mysqli (improved). Este documento recebe uma string via POST (uma string no formato de uma XML) e essa string é analisada utilizando a class simplexml e dessa forma, os atributos do cliente são setados (exemplo, código, nome e grupo).

 

Então eu monto o comando SQL:

 

$SQLCommand = "INSERT INTO cliente VALUES (?,?,?);

Então eu preparo o comando e depois defino os parâmetros do comando:

 

$statement = $dbc->prepare($SQLCommand);
$statement->bind_param("iss",$clientCode,$clientName,$clientGroup);

Depois eu executo e tudo está normal.

 

O problema é que caso o nome do cliente tenha acentos, ao consultar a tabela (por um outro documento PHP ou mesmo pela linha de comando) o nome aparece com caracteres engraçados.

 

Os dados são enviados via AJAX, onde eu já defini o cabeçalho para form-encoded e charset = ISO-8859-1, usando setRequestHeader().

 

A tabela de cliente está definida com charset = latin1

 

Parece ser algum problema no caminho do AJAX para o PHP, os dados parecem estar sendo transmitidos em outro charset, não o ISO-8859-1.

 

Agradeço por ajuda

 

Grato

Compartilhar este post


Link para o post
Compartilhar em outros sites

Depois de muitas horas pesquisando e muitos testes, cheguei à uma possível conclusão:

  • Dados enviados via POST pelo objeto XMLHttpRequest são codificados antes de serem enviados, codificação de URI.
  • O PHP, ao receber estes dados, faz a decodificação para utf-8, no escopo do código.
  • Caso você deseje trabalhar com um string em iso-8859-1 no PHP, é necessário decodificar (usando utf8_decode()) para iso-8859-1.
  • O mais estranho, antes de usar a string como parâmetro de um comando SQL, é necessário decodificar novamente, usando a função utf8_decode().
Resumindo, é necessário decodificar os dados recebidos via POST para o escopo do código e depois decodificar novamente antes de utiliza-lo como parâmetro de um comando SQL, usando a classe mysqli.

 

Por exemplo, se você usar uma variável:

 

$userName = "José do Nascimento";
...
$SQLCommand = "INSERT INTO user VALUES (1,$userName);
...
$statement->execute();

Será gravado na tabela (com codificação latin1): JosÃ@| do Nascimento

 

Decodificando:

 

$userName = utf8_decode("José do Nascimento");
...
$SQLCommand = "INSERT INTO user VALUES (1,$userName);
...
$statement->execute();

Será gravado na tabela: José do Nascimento.

 

Dessa forma está claro, pois o PHP utiliza utf-8 como charset por padrão, e, se você precisa gravar em uma tabela latin1, logicamente você deverá "traduzir" antes de gravar.

 

Agora quanto à segunda decodificação, ela ainda é meio obscura (pelo menos na minha opinião).

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.