如何在每次连接时使PDO运行SET NAMES utf8,在ZendFramework中

时间:2009-02-25 04:03:32

标签: php zend-framework pdo zend-db-table

如何在每次连接时使PDO适配器运行SET NAMES utf8,在ZendFramework中。 我正在使用INI文件来保存适配器配置数据。我应该在那里添加哪些条目?

如果不清楚,我正在寻找正确的语法来在我的项目的config.ini文件中进行,而不是在php代码中,因为我认为这是配置代码的一部分。

8 个答案:

答案 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的任何其他方法都将失败。

这是我今天学到的东西,正在努力解决这个问题:

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

  2. 使用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为你完成。

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

  4. 如果用5.3.1或更高版本替换你的php版本(我也测试过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来说不是问题)

  6. 考虑到所有这一切,你应该能够节省一天的谷歌搜索并保留你的一些头发! ;)

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