0

XMLを取得し、いくつかのデータを選択して、データベース(MySQL)に挿入するPHPスクリプトがあります。私のフィールドはすべて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');
?>

答えてくれてありがとう!

4

2 に答える 2

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れ、データベースに正しく格納されます。

于 2013-03-12T14:31:56.193 に答える
1

これで問題が解決するはずです:

...
$xml = simplexml_load_file('arquivo.xml');
$xml = iconv('ISO-8859-1', 'UTF-8', $xml);
...
于 2013-03-12T14:28:51.513 に答える