如何在每次连接时使PDO适配器运行SET NAMES utf8,在ZendFramework中。 我正在使用INI文件来保存适配器配置数据。我应该在那里添加哪些条目?
如果不清楚,我正在寻找正确的语法来在我的项目的config.ini文件中进行,而不是在php代码中,因为我认为这是配置代码的一部分。
答案 0 :(得分:122)
害怕我的google-fu
$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
第一次击中;)
答案 1 :(得分:47)
伊泰,
一个非常好的问题。幸运的是,答案非常简单:
database.params.driver_options.1002 = "SET NAMES utf8"
1002是常量PDO的值:: MYSQL_ATTR_INIT_COMMAND
您不能在config.ini中使用常量
答案 2 :(得分:32)
将其放入您的配置
database.params.charset = "utf8"
或在ZF 1.11之后,这将起作用
resources.db.params.charset = utf8
就是这样
答案 3 :(得分:4)
zend_db中的连接是惰性的,这意味着它在第一个查询上连接。 如果你有一个没有查询的静态页面,它甚至都不会连接 - 即使它是在你的bootstrap文件中初始化的。
所以跑步:
$db->query("SET NAMES 'utf8'");
不是那么聪明。 非常感谢dcaunt的解决方案。
答案 4 :(得分:3)
所有这些方法 shoud 都有效,除非在某些特殊情况下。例如,如果您在具有php<的Windows机器上本地运行Web服务器。 5.3.1,只有'手动'$ db->查询(“SET NAMES'utf8'”);在您的实际查询工作之前。 尝试使用MYSQL_ATTR_INIT_COMMAND的任何其他方法都将失败。
这是我今天学到的东西,正在努力解决这个问题:
你不能在某些环境中引用PDO :: MYSQL_ATTR_INIT_COMMAND(即我的,特别是我不知道)。你必须明确地使用1002而不是
使用Zend Framework 1.11(可能从1.8开始确认),您无需在config.ini:resources.db中设置database.params.driver_options.1002 =“SET NAMES utf8”。 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来说不是问题)
考虑到所有这一切,你应该能够节省一天的谷歌搜索并保留你的一些头发! ;)
答案 5 :(得分:1)
您只需在启动查询之前执行此命令,您只需在查询之前执行一次而不是每次查询。
$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;
答案 6 :(得分:0)
在你的bootstrap文件中......
$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");
然后将此实例保存在注册表中
Zend_Registry::set('db', $db);
答案 7 :(得分:-1)
$table->getAdapter()->query('SET NAMES UTF8');