如何使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将失败。

以下是我今天所学到的,正在努力解决这个问题:

  1. 你不能在某些环境下(即我的,我不知道)引用PDO :: MYSQL_ATTR_INIT_COMMAND。 你必须明确地使用1002

  2. 使用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就足够了。

  3. 在Windows上,您需要php> = 5.3.1才能使用MYSQL_ATTR_INIT_COMMAND。

  4. 如果你用5.3.1或更高版本replace你的php版本(我也testing过5.3.3),你需要确保你的php.ini文件中的值设置为pdo_mysql.default_socket。 默认的空值将不起作用(待确认:我读了一些关于这个的内容,但是在发现了第5点之后没有去尝试)

  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');