php - 插入数据库时​​字符损坏

标签 php mysql utf-8 character-encoding

我有一个 PHP 脚本,它获取 XML、选择一些数据并将它们插入我的数据库 (MySQL)。我所有的字段都是 utf8_bin。此 XML 为 ISO-8859-1,无法更改,因为是另一个网站将其发送给我。

示例:字符串“NG Contábil”在我的数据库中设置为“NG Contá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');
?>

感谢您的回答!

最佳答案

您只忽略了一点细微差别:
mysql_query("SET NAMES 'utf8'"); 不是为了进行正确编码而必须施放的魔法咒语,而是一个 SQL 查询,需要在 中运行您实际用于运行 SQL 查询的同一实例

因此,如果您使用 ConectaBD::get_instance() 连接到您的 mysql 数据库;你必须在那个调用之后运行SET NAMES utf8查询,而不是之前。

I don't know why, but adding utf8_decode() solves the problem

我知道。
simplexml 的输出总是 utf-8。
然而,正如我在上面指出的那样,您没有将客户端连接设置为 utf8
所以,它仍然是默认的 latin1
使用(非常无用的)utf8_decode() 调用,您可以将 utf-8 数据转换回 latin1,从而将其正确存储到数据库中。

关于php - 插入数据库时​​字符损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15363954/

相关文章:

php - 实现多个客户 list

php - 这个 "session locking"方法有一个通用名称吗?

c - Windows 控制台中的希腊字母

php - 为什么 codeigniter 的 session 会自动过期?如果在网页上使用ajax调用

php - jquery 在添加 html 后向 div 添加切换功能

php - 使用插入 PDO 检索值

php - 用于让我的注销按钮通过 php 工作的最佳 html 表单是什么

mysql - 删除多行

php - 如何在 PHP 中使用 preg_replace 匹配俄语单词?

c++ - UTF-8 数据的最佳类型?