2013-03-12 4 views
0

XML을 가져 와서 일부 데이터를 선택하고이를 데이터베이스 (MySQL)에 삽입하는 PHP 스크립트가 있습니다. 내 모든 필드는 utf8_bin입니다. 이 XML은 ISO-8859-1이며이를 전송하는 다른 사이트이기 때문에이 XML을 변경할 수 없습니다.데이터베이스에 삽입 할 때 문자가 손상됩니다.

예 : 문자열 "NG Contábil"은 "db Contill"로 설정됩니다. 내 스크립트입니다 :

<?php 
header('Content-Type: text/html; charset=utf-8'); 
mysql_query("SET NAMES 'utf8'"); 
mysql_query('SET character_set_connection=utf8'); 
mysql_query('SET character_set_client=utf8'); 
mysql_query('SET character_set_results=utf8'); 

include '/PagSeguroLibrary/PagSeguroLibrary.php'; 
include '/PagSeguroLibrary/domain/PagSeguroAccountCredentials.class.php'; 
include 'conexao.php'; 
include 'alias_array.php'; 
include 'retorna_cpf.php'; 

$conexao = ConectaBD::get_instance(); 
$conexao->conectar_pronto(); 
$conexao->BD_pronto(); 

//(...) 

$xml = simplexml_load_file('arquivo.xml'); 

if($xml === null) 
    $xml = simplexml_load_string($resposta_transacao); 

$status = $xml->status; 
$nome = $xml->sender->name; 
$email = $xml->sender->email; 
$codigo = $xml->code; 
$vetor = $xml->items->item; 

$cpf = retorna_cpf($email); 

foreach($vetor as $v) 
{ 
    $nome_produto = $v->description; 

    if($nome_produto != 'frete') 
    { 
     //Retorna o id do produto a partir da descrição 
     $result = mysql_query('SELECT id_product 
     FROM ps_product_lang 
     WHERE name = "'.$nome_produto.'"'); 

     $array = Array(); 
     while($row = mysql_fetch_alias_array($result)) 
     { 
      foreach($row as $linha) 
       array_push($array, $linha); 
     }   

     mysql_query('INSERT INTO pagamento(Status, Nome, Email, CPF, idproduto, Codigo, Inscrito, id, Enviado, NomeProduto) 
     VALUES ("'.$status.'", "'.$nome.'", "'.$email.'", "'.$cpf.'", "'.$array[0].'", "'.$codigo.'", 0, null, 0, "'.$nome_produto.'")'); 
    } 
    } 
fclose($arquivo); 
unlink('arquivo.xml'); 
?> 

모든 답변 주셔서 감사합니다!

+0

XML의 처음 몇 줄을 붙여 넣을 수 있습니까? – Sjoerd

+0

'utf8'또는 'utf-8'입니까? – EmCo

+0

나는 또한 같은 문제가 .. mysql_set_charset() 사용하여 내 문제를 해결 ... http://php.net/manual/en/function.mysql-set-charset.php 모양을 가지고 – alwaysLearn

답변

2

:
mysql_query("SET NAMES 'utf8'"); 적절한 인코딩을 만들기 위해 캐스팅 할 필요가 마법의 주문이 아니라 실제로 SQL 쿼리를 , 동일한 인스턴스에서 을 실행할 필요가 있습니다. 실제로 SQL 쿼리를 실행하는 데 사용하고 있습니다.

ConectaBD :: get_instance()를 사용하여 mysql 데이터베이스에 연결하는 경우; 후에 SET NAMES utf8 쿼리 을 실행해야합니다.

나는 이유를 알고 있지만) (utf8_decode를 추가하면 문제를 내가 아는

를 해결하지 않습니다.
simplexml의 출력은 이고 항상 utf-8입니다.
위에서 지적한대로 클라이언트 연결을 utf8으로 설정하지 마십시오.
그래서 기본값으로 유지됩니다. latin1
(매우 쓸모없는) utf8_decode() 호출로 utf-8 데이터를 latin1으로 다시 캐스팅하므로 올바르게 데이터베이스에 저장됩니다.

+0

큰! 이게 내 문제를 해결했습니다. 고마워요! –

1

이 문제 해결한다 : 당신은 단지 하나의 작은 뉘앙스 간과

... 
$xml = simplexml_load_file('arquivo.xml'); 
$xml = iconv('ISO-8859-1', 'UTF-8', $xml); 
... 
관련 문제