40

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

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

4

8 回答 8

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

第一击;)

于 2009-02-25T07:00:56.650 回答
47

伊泰,

一个非常好的问题。幸运的是,答案很简单:

database.params.driver_options.1002 = "SET NAMES utf8"

1002 是常量 PDO::MYSQL_ATTR_INIT_COMMAND 的值

您不能在 config.ini 中使用常量

于 2009-03-31T20:11:09.367 回答
32

只需将其放入您的配置中

database.params.charset = "utf8"

resources.db.params.charset = utf8 或者在 ZF 1.11 之后这会起作用

于 2009-09-07T12:19:03.507 回答
4

zend_db 中的连接是惰性的,这意味着它在第一个查询时连接。如果您有一个没有查询的静态页面,它甚至永远不会连接 - 即使它在您的引导文件中初始化。

如此运行:

$db->query("SET NAMES 'utf8'");

不是那么聪明。非常感谢 dcaunt 的解决方案。

于 2009-07-29T06:41:48.873 回答
3

所有这些方法都应该有效,除非在某些特殊情况下。例如,如果您在 php < 5.3.1 的 windows 机器上本地运行 web 服务器,则只有一个 'manual' $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 或更高版本替换你的 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 来说不是问题)

考虑到这一切,您应该可以节省一天的谷歌搜索时间并保留一些头发!;)

于 2010-12-03T18:42:37.097 回答
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; 
于 2018-04-26T07:50:46.403 回答
0

在您的引导文件中...

$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");

然后将此实例保存在注册表中

Zend_Registry::set('db', $db);
于 2009-03-06T18:59:26.660 回答
-1
$table->getAdapter()->query('SET NAMES UTF8');
于 2010-09-21T18:20:30.713 回答