2013-03-12 254 views
0

我有一個PHP腳本,它獲取XML,選擇一些數據並將它們插入到我的數據庫(MySQL)中。我所有的字段都是utf8_bin。這個XML是ISO-8859-1,不能改變這個,因爲是另一個網站發送給我。插入數據庫時​​字符損壞

例如:字符串「NGContábil」在我的數據庫中設置爲「NGContábil」。這是我的腳本:

<?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 2013-03-12 14:29:36

+0

它是'utf8'還是'utf-8'? – EmCo 2013-03-12 14:30:09

+0

我也有同樣的問題..使用mysql_set_charset()解決了我的問題... http://php.net/manual/en/function.mysql-set-charset.php看看 – alwaysLearn 2013-03-12 14:33:28

回答

2

你忽略只是一個小的細微差別:
mysql_query("SET NAMES 'utf8'");是不是一個神奇的法術有爲了使正確的編碼定投,但實際上是一個SQL查詢,需要運行與您實際用於運行SQL查詢的實例相同。因此,如果你使用ConectaBD :: get_instance()連接到你的mysql數據庫,那麼你可以使用ConectaBD :: get_instance()來連接你的mysql數據庫。你必須運行SET NAMES utf8查詢之後那個調用,而不是之前。

我不知道爲什麼,但添加utf8_decode()解決了這個問題

我知道。
simplexml的輸出是總是 utf-8。
雖然,正如我上面指出的那樣,您不會將客戶端連接設置爲utf8
因此,它仍然是默認latin1
隨着(相當無用)utf8_decode()調用你您鑄造utf-8數據回latin1因此它正確地存儲到數據庫中。

+0

大!這解決了我的問題。非常感謝你! – 2013-03-12 15:19:07

1

這應該解決您的問題:

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