MYSQL_ATTR_INIT_COMMAND中的PDO SET SESSION和SET NAMES

GeP*_*axa 0 php mysql pdo

我正在尝试建立UTF-8连接,但是由于某些原因,我不能将其断开,如果我删除系统SET SESSION,MYSQL_ATTR_INIT_COMMAND则无法更改此连接MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'

这可以正常工作,看起来很好的特殊字符,但是不能创建新帐户:

array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
Run Code Online (Sandbox Code Playgroud)

这是我的代码:

<?php
class DB {
    private static $_instance = null;
    private $_pdo, $_query, $_error = false, $_results, $_resultsArray, $_count = 0, $_lastId, $_queryCount=0;

    private function __construct(){
        try{
            $this->_pdo = new PDO('mysql:host=' .
                Config::get('mysql/host') .';dbname='. 
                Config::get('mysql/db'), 
                Config::get('mysql/username'), 
                Config::get('mysql/password'),
                array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET SESSION sql_mode = ''"));
        } catch(PDOException $e){
            die($e->getMessage());
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何实现而不破坏我的代码?

You*_*nse 5

我总是想知道,为什么PDO用户如此沉迷于以某种棘手的方式运行常规SQL查询,而不是仅仅使用用于此任务的常规函数​​来运行常规SQL查询。

private function __construct(){
        $this->_pdo = new PDO('mysql:host=' .
            Config::get('mysql/host') .';dbname='. 
            Config::get('mysql/db'), 
            Config::get('mysql/username'), 
            Config::get('mysql/password'),
            array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION));
        $this->_pdo->query("SET SESSION sql_mode = ''");
        $this->_pdo->query("SET NAMES utf8");
}
Run Code Online (Sandbox Code Playgroud)

您看到连接后,可以根据需要运行任意数量的其他SQL查询。

请注意,如果在DSN中设置字符集对您不起作用,则意味着您的PHP版本已经过时了,您应尽快升级。当然,不是针对字符集的问题,而是针对自弃用您的版本以来的所有这些年来发布的所有安全修复程序。

另请注意,您的班级有许多设计缺陷。我建议您阅读我写的文章,您的第一个数据库包装程序的童年疾病,并修复错误报告,有状态变量以及我相信在班上其余部分中存在的许多其他问题。