ZendFramework で、接続するたびに PDO アダプターに SET NAMES utf8 を実行させる方法。INI ファイルを使用してアダプターの構成データを保存しています。そこにどのエントリを追加する必要がありますか?
明確でない場合は、構成コードのこの部分を考慮しているため、php コードではなく、プロジェクトの config.ini ファイルで正しい構文を探しています。
ZendFramework で、接続するたびに PDO アダプターに SET NAMES utf8 を実行させる方法。INI ファイルを使用してアダプターの構成データを保存しています。そこにどのエントリを追加する必要がありますか?
明確でない場合は、構成コードのこの部分を考慮しているため、php コードではなく、プロジェクトの config.ini ファイルで正しい構文を探しています。
私のgoogle-fuを恐れる
$pdo = new PDO(
'mysql:host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
最初のヒット;)
イタイ、
とても良い質問です。幸いなことに、答えは非常に簡単です。
database.params.driver_options.1002 = "SET NAMES utf8"
1002 は、定数 PDO::MYSQL_ATTR_INIT_COMMAND の値です。
config.ini で定数を使用することはできません
これを設定に入れるだけです
database.params.charset = "utf8"
またはZF 1.11の後、これ
resources.db.params.charset = utf8
はそれで機能します
zend_db の接続は遅延です。つまり、最初のクエリで接続します。クエリが含まれていない静的ページがある場合、ブートストラップファイルで初期化されていても、接続することはありません。
実行中:
$db->query("SET NAMES 'utf8'");
あまり賢くありません。解決策を提供してくれた dcaunt に感謝します。
いくつかの特別な状況を除いて、これらの方法はすべて機能するはずです。たとえば、PHP 5.3.1 より前の Windows マシンで Web サーバーをローカルで実行している場合、'manual' $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 では、MYSQL_ATTR_INIT_COMMAND が機能するには php >= 5.3.1 が必要です。
PHP のバージョンを 5.3.1 以降に置き換える場合 (私は 5.3.3 もテストしました)、php.ini で pdo_mysql.default_socket に値を設定する必要があります。デフォルトの空の値は機能しません(確認する必要があります:これについて何か読んだことがありますが、ポイント5について知った後、わざわざそれなしで試してみませんでした)
また、windows\system32\drivers\etc\hosts 隠しシステム ファイルに '127.0.0.1 localhost' があることを確認する必要があります (php 5.3.0 では問題ありませんでした)。
これらすべてを念頭に置いて、グーグルで一日を節約し、髪の毛の一部を保つことができるはずです! ;)
あなたのブートストラップファイルで...
$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");
次に、このインスタンスをレジストリに保存します
Zend_Registry::set('db', $db);
$table->getAdapter()->query('SET NAMES UTF8');