PDO SET SESSION和MYSQL_ATTR_INIT_COMMAND中的设置名称

时间:2016-10-17 01:20:21

标签: php mysql pdo

我正在尝试设置我的UTF-8连接,但由于某些原因,如果我移除SET SESSION中的MYSQL_ATTR_INIT_COMMAND,我的系统会崩溃,那么我无法更改此MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' 1}}

这样可行,看起来不错的特殊字符,但无法创建新帐户:

array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

这是我的代码:

<?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());
        }
    }
}

知道如何在不破坏我的代码的情况下实现它吗?

1 个答案:

答案 0 :(得分:4)

它总是让我想知道,为什么PDO用户如此着迷于使用常规函数运行常规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");
}

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

请注意,如果在DSN中设置charset并不适合您,则表示您的PHP版本非常过时,您应该尽快升级。当然不是针对charset问题,而是针对所有这些年来发布的所有安全修复程序,因为您的版本已被放弃。

另请注意,您的班级存在许多设计缺陷。我建议你阅读我写的文章Your first database wrapper's childhood diseases,并修复错误报告,有状态变量和许多其他问题的问题,我相信,这些问题存在于课程的其他部分