我正在尝试设置我的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());
}
}
}
知道如何在不破坏我的代码的情况下实现它吗?
答案 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,并修复错误报告,有状态变量和许多其他问题的问题,我相信,这些问题存在于课程的其他部分