Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/63.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php PDO+;MySQL和中断的UTF-8编码_Php_Mysql_Pdo_Character Encoding - Fatal编程技术网

Php PDO+;MySQL和中断的UTF-8编码

Php PDO+;MySQL和中断的UTF-8编码,php,mysql,pdo,character-encoding,Php,Mysql,Pdo,Character Encoding,我将PDO库与PHP中的MySQL数据库一起使用,但如果我插入任何以UTF-8编码的数据(如阿拉伯语),它将被插入到数据库中,但作为? 在我自己的框架中,创建PDO连接后,我发送两个查询—SET NAMES utf8和SET CHARACTER SET utf8。它仍然不起作用 例如: loadclass('PDO', array( sprintf( 'mysql:host=%s;port=%s;dbname=%s', confitem('database

我将PDO库与PHP中的MySQL数据库一起使用,但如果我插入任何以UTF-8编码的数据(如阿拉伯语),它将被插入到数据库中,但作为

在我自己的框架中,创建PDO连接后,我发送两个查询—
SET NAMES utf8
SET CHARACTER SET utf8
。它仍然不起作用

例如:

loadclass('PDO', array(
    sprintf(
        'mysql:host=%s;port=%s;dbname=%s',
        confitem('database', 'host'),
        confitem('database', 'port'),
        confitem('database', 'name')
    ),
    confitem('database', 'username'),
    confitem('database', 'password'),
    array('PDO::ATTR_PERSISTENT' => confitem('database', 'pconnect'))
));
$this->query('SET NAMES ' . confitem('database', 'charset'));
$this->query('SET CHARACTER SET ' . confitem('database', 'charset'));

解决方法:在将数据插入数据库之前,使用
json_encode
函数转换数据,在获取数据后使用
json_decode
对其进行解码。我现在就是这样做的。

尝试将php.ini中的
默认\u字符集
值设置为UTF-8。或者您可以使用该函数进行设置

此外,如果输入来自表单提交,请确保使用meta标记将您的网页设置为UTF-8。

使用:

$pdo = new PDO( 
    'mysql:host=hostname;dbname=defaultDbName', 
    'username', 
    'password', 
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8") 
); 

它在PDO连接上强制使用UTF-8。它对我起作用。

您必须为连接设置正确的字符集。(这是MySQL特有的!)

但是,在5.3.6之前的PHP版本中,必须使用变通方法,因为不支持
charset
选项

$pdo = new PDO(
    'mysql:host=hostname;dbname=defaultDbName',
    'username',
    'password',
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8")
);
所有尝试,如:

PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "

仍然生成无法读取的文本混乱

在我的例子中,问题的原因是:
htmlentities
在将数据插入数据库之前使用。
西里尔字母被完全销毁。

你确定这不是PHP的问题吗?确保安装了mbstring?我建议发回相同的字符串并检查它是否正常到达。作为测试。什么是confitem('database','charset')值?Col.shrapanel:confitem('database','charset')的结果是UTF8hello,好的,我会尝试,但我不需要这个解算,我想从我的脚本中解算:)?是的。。我测试了来自网页的数据,是的,它带有utf-8编码,还有一个utf-8编码元标记。我在Windows机器上遇到了同样的问题,这就是问题的解决方案。一切都在谈论UTF-8。。。除了PHP。想要更新现有的投票结果,但是。因此,将其作为新答案发布。谢谢
charset=utf8'
在Datatable服务器端为我工作谢谢!charset=utf8也是我处理这个非常恼人的问题的原因。你能同时做这两件事吗,还是会引起副作用?换句话说,为什么不总是在连接字符串中设置字符集并传递set NAMES选项呢?如果您有PDO::MYSQL_ATTR_INIT_COMMAND=>“set NAMES”UTF8“”--确保您没有添加:-->exec(“set CHARACTER set UTF8”)…您必须使用extension=intl或extension=php_intl.dllNice启用它。如果在PHP中得到空结果,但在MySQL客户机中使用相同的SQL得到非常好的结果,则很可能是这样。问题在我添加您的解决方案的那一刻就解决了请参见Palec的答案,charset=utf8通常是更好的方法。
PDO::MYSQL_ATTR_INIT_COMMAND =>"SET NAMES 'utf8mb4' COLLATE 'utf8mb4_unicode_ci' "
$this->connection = new PDO('mysql:host='.DBHOST.';dbname='.DBNAME.';charset=utf8', DBUSER, DBPASS, self::$opt);
$this->connection->exec("set names utf8");