40

ZendFramework で、接続するたびに PDO アダプターに SET NAMES utf8 を実行させる方法。INI ファイルを使用してアダプターの構成データを保存しています。そこにどのエントリを追加する必要がありますか?

明確でない場合は、構成コードのこの部分を考慮しているため、php コードではなく、プロジェクトの config.ini ファイルで正しい構文を探しています。

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"

またはZF 1.11の後、これ resources.db.params.charset = utf8 はそれで機能します

于 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 では、MYSQL_ATTR_INIT_COMMAND が機能するには php >= 5.3.1 が必要です。

  4. PHP のバージョンを 5.3.1 以降に置き換える場合 (私は 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 に答える
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 に答える