如何让 PDO 适配器在我每次连接时运行 SET NAMES utf8,在 ZendFramework 中。我正在使用 INI 文件来保存适配器配置数据。我应该在那里添加哪些条目?
如果不清楚,我正在我的项目的 config.ini 文件中而不是在 php 代码中寻找正确的语法,因为我认为这部分配置代码。
如何让 PDO 适配器在我每次连接时运行 SET NAMES utf8,在 ZendFramework 中。我正在使用 INI 文件来保存适配器配置数据。我应该在那里添加哪些条目?
如果不清楚,我正在我的项目的 config.ini 文件中而不是在 php 代码中寻找正确的语法,因为我认为这部分配置代码。
害怕我的google-fu
$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
第一击;)
伊泰,
一个非常好的问题。幸运的是,答案很简单:
database.params.driver_options.1002 = "SET NAMES utf8"
1002 是常量 PDO::MYSQL_ATTR_INIT_COMMAND 的值
您不能在 config.ini 中使用常量
只需将其放入您的配置中
database.params.charset = "utf8"
resources.db.params.charset = utf8
或者在 ZF 1.11 之后这会起作用
zend_db 中的连接是惰性的,这意味着它在第一个查询时连接。如果您有一个没有查询的静态页面,它甚至永远不会连接 - 即使它在您的引导文件中初始化。
如此运行:
$db->query("SET NAMES 'utf8'");
不是那么聪明。非常感谢 dcaunt 的解决方案。
所有这些方法都应该有效,除非在某些特殊情况下。例如,如果您在 php < 5.3.1 的 windows 机器上本地运行 web 服务器,则只有一个 'manual' $db->query("SET NAMES 'utf8'"); 在您的实际查询起作用之前。尝试使用 MYSQL_ATTR_INIT_COMMAND 的任何其他方法都将失败。
这是我今天学到的东西,正在努力解决这个问题:
您不能在某些环境中引用 PDO::MYSQL_ATTR_INIT_COMMAND (即我的,具体我不知道)。您必须明确使用 1002
使用 Zend Framework 1.11(可能从 1.8 开始,有待确认),您不需要在 config.ini 中设置 database.params.driver_options.1002 = "SET NAMES utf8" :resources.db.params.charset = "utf8 " 足以让 Zend_Db_Adapter_Pdo_Mysql 为你做这件事。
在 Windows 上,您需要 php >= 5.3.1 才能使 MYSQL_ATTR_INIT_COMMAND 工作。
如果你用 5.3.1 或更高版本替换你的 php 版本(我也测试了 5.3.3),你需要确保在你的 php.ini 中为 pdo_mysql.default_socket 设置了一个值。默认的空值不起作用(有待确认:我读过一些关于此的内容,但在发现第 5 点后没有费心尝试没有它)
您还需要确保您的 windows\system32\drivers\etc\hosts 隐藏系统文件中有“127.0.0.1 localhost”(这对 php 5.3.0 来说不是问题)
考虑到这一切,您应该可以节省一天的谷歌搜索时间并保留一些头发!;)
您只需在开始查询之前执行此命令,您只需在查询之前执行一次,而不是每次查询。
$pdo->query("SET NAMES 'utf8'");
完整示例
$servername = "localhost";
$username = "root";
$password = "test";
$dbname = "yourDB";
try {
$pdo = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
$pdo->query("SET NAMES 'utf8'");
//set the PDO error mode to exception
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT name FROM nations";
foreach ($pdo->query($sql) as $row) {
echo "<option value='".$row['name']."'>".$row['name']."</option>";
}
} catch(PDOException $e) {
echo "Error: " . $e->getMessage();
}
$pdo = null;
在您的引导文件中...
$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");
然后将此实例保存在注册表中
Zend_Registry::set('db', $db);
$table->getAdapter()->query('SET NAMES UTF8');