【发布时间】:2010-10-09 17:44:15
【问题描述】:
如何让 PDO 适配器在我每次连接时运行 SET NAMES utf8,在 ZendFramework 中。 我正在使用 INI 文件来保存适配器配置数据。我应该在那里添加哪些条目?
如果不清楚,我正在我的项目的 config.ini 文件中而不是在 php 代码中寻找正确的语法,因为我认为这部分配置代码。
【问题讨论】:
标签: php zend-framework pdo zend-db-table
如何让 PDO 适配器在我每次连接时运行 SET NAMES utf8,在 ZendFramework 中。 我正在使用 INI 文件来保存适配器配置数据。我应该在那里添加哪些条目?
如果不清楚,我正在我的项目的 config.ini 文件中而不是在 php 代码中寻找正确的语法,因为我认为这部分配置代码。
【问题讨论】:
标签: php zend-framework pdo zend-db-table
害怕我的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"
或在 ZF 1.11 之后,这将适用于
resources.db.params.charset = utf8
就是这样
【讨论】:
zend_db 中的连接是惰性的,这意味着它在第一个查询时连接。 如果你有一个没有查询的静态页面,它甚至永远不会连接 - 即使它在你的引导文件中初始化。
这样运行:
$db->query("SET NAMES 'utf8'");
没那么聪明。 非常感谢 dcaunt 的解决方案。
【讨论】:
所有这些方法应该工作,除非在某些特殊情况下。例如,如果您在 php query("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 工作。
如果您将 php 版本替换为 5.3.1 或更高版本(我也测试了 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');
【讨论】: