如何使PDO运行SET NAMES utf8每次连接时,在ZendFramework中
如何使PDO适配器每次连接时运行SET NAMES utf8,在ZendFramework中。 我正在使用INI文件来保存适配器configuration数据。 我应该在那里添加什么条目?
如果不清楚,我正在寻找正确的语法,在我的项目的config.ini文件中,而不是在php代码中,因为我认为这部分的configuration代码。
伊泰,
一个很好的问题。 幸运的是,答案很简单:
database.params.driver_options.1002 = "SET NAMES utf8"
1002是常量PDO :: MYSQL_ATTR_INIT_COMMAND的值
你不能在config.ini中使用常量
害怕我的谷歌福
$pdo = new PDO( 'mysql:host=mysql.example.com;dbname=example_db', "username", "password", array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
先打;)
只要把这个在你的configuration
database.params.charset = "utf8"
或ZF 1.11后这将工作到resources.db.params.charset = utf8
这是它
在zend_db中的连接是懒惰的,这意味着它连接到第一个查询。 如果你有一个没有查询的静态页面,它甚至不会连接 – 即使它在你的引导文件中初始化。
如此运行:
$db->query("SET NAMES 'utf8'");
不那么聪明 非常感谢他的解决scheme。
所有这些方法都适用,除了在某些特殊情况下。 例如,如果您正在使用php <5.3.1在Windows计算机上本地运行Web服务器,则只需要一个“手动”$ 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或更高版本replace你的php版本(我也testing过5.3.3),你需要确保你的php.ini文件中的值设置为pdo_mysql.default_socket。 默认的空值将不起作用(待确认:我读了一些关于这个的内容,但是在发现了第5点之后没有去尝试)
-
你还需要确保你的windows \ system32 \ drivers \ etc \ hosts中有'127.0.0.1 localhost'隐藏的系统文件(这对php 5.3.0来说不是问题)
考虑到这一切,你应该能够保存一天的search结果并保留一些头发! ;)
在你的引导文件中…
$db = Zend_Db::factory($adapter, $config); $db->query("SET NAMES 'utf8'");
那么你将这个实例保存在registry中
Zend_Registry::set('db', $db);
$table->getAdapter()->query('SET NAMES UTF8');