PHP - 文件获取内容和正确的编码

时间:2016-04-28 13:37:06

标签: php mysql encoding

我正在编写一个小脚本,它负责两件事: - 截断数据库 - 将文件上传到数据库

看起来像这样:

<?php
error_reporting(E_ALL);
ini_set('display_errors', '1');


$mysql_host = 'localhost';
$mysql_username = 'x';
$mysql_password = 'y';
$mysql_database = 'z';

$db = new PDO('mysql:dbname='.$mysql_database.';host='.$mysql_host,$mysql_username,$mysql_password);

// works not with the following set to 0. You can comment this line as 1 is default
$db->setAttribute(PDO::ATTR_EMULATE_PREPARES, 1);

function truncate_db()
{
    global $db;

    $sql_query_1 = "
    TRUNCATE TABLE `VISITS`; 
    TRUNCATE TABLE `ANIMALS`;
    TRUNCATE TABLE `DOCTORS`;
    TRUNCATE TABLE `PAYMENTS`;
    TRUNCATE TABLE `CUSTOMER`
    "; 

    try {
        $stmt = $db->prepare($sql_query_1);
        $stmt->execute();
        echo "Truncate action - OK";
    }
    catch (PDOException $e)
    {
        echo $e->getMessage();
        die();
    }
}

function import_db()
{
    global $db;

    try
       {
         $sql_query_2 = implode(array_map(function ($v) {
            return file_get_contents($v);
            }, glob(__DIR__ . "/*.sql")));

         $qr = $db->exec($sql_query_2); 
         echo "Import action - OK";
       }
       catch (PDOException $e) 
       {
         echo 'Connection failed: ' . $e->getMessage();
    }
}

truncate_db();
echo '<br />';
import_db();

$db = null;
?>

问题 - 我上传到数据库的文件(sql one)包含特殊的字符(如ś,ó,etc.等)之后我在数据库中遇到一些问题,其中一些字不包含任何字更多那些符号。上传后我有符号:³,¿等。如何编辑import_db()函数来保存这些字符?我想过:

mb_convert_encoding

但我不知道如何将其合并到我的代码中; /在我的数据库表中,包含该单词(包含特殊字符)的列设置为:UTF8_General_CI。谢谢!

1 个答案:

答案 0 :(得分:1)

我不清楚你的问题是什么

截断文字是指您尝试插入Señor,但发现表格中只显示Se。这种截断形式通常由

引起
  • 客户端重复了用latin1(或latin2等)和
  • 编码的字符
  • SET NAMES utf8INSERT(或LOAD DATA
  • 期间生效

也就是说,您应该在utf8中获取文本,或者您应该更改您告诉MySQL编码的内容。

如果您可以获取文件内容的十六进制,则{f}中的ś ó ę应为2字节十六进制C59B C3B3 C499。 latin1只有ó作为单个字节F3。在latin2中,那些是B6 F3 EA,所以也许这就是你来自哪里?

SET NAMES所说的内容与您对表/列建立的内容CHARACTER SET之间的不匹配是可以的。 MySQL将在传输时转换编码。

使用MySQL时不要使用mb_convert_encoding或任何其他转换函数,只会增加混乱。

此外,一次执行TRUNCATEs一个。 API不喜欢多个语句。