brunitto 0 Denunciar post Postado Outubro 30, 2007 [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
brunitto 0 Denunciar post Postado Outubro 31, 2007 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