ZendFrameworkで、接続するたびにPDOアダプターにSET NAMES utf8を実行させる方法。 INIファイルを使用してアダプター構成データを保存しています。どのエントリーをそこに追加する必要がありますか?
明確ではなかった場合、構成コードのこの部分を考慮して、PHPコードではなくプロジェクトのconfig.iniファイルでそれを行う正しい構文を探しています。
イタイ、
とてもいい質問です。幸いなことに、答えは非常に簡単です。
database.params.driver_options.1002 = "SET NAMES utf8"
1002は定数PDO :: MYSQL_ATTR_INIT_COMMANDの値です
Config.iniで定数を使用することはできません
私を恐れる google-f
$pdo = new PDO(
'mysql:Host=mysql.example.com;dbname=example_db',
"username",
"password",
array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));
最初のヒット;)
これを設定に入れるだけです
database.params.charset = "utf8"
またはZF 1.11以降、これはresources.db.params.charset = utf8
それだ
Zend_dbの接続は遅延しているため、最初のクエリで接続します。クエリが含まれていない静的なページがある場合は、接続することさえありません-あなたがbootstrapファイルで初期化されている場合でも。
実行中:
$db->query("SET NAMES 'utf8'");
それほどスマートではありません。 dcauntのソリューションに感謝します。
このすべてのメソッドshoudは、特別な状況を除いて機能します。たとえば、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では問題ではありませんでした)
これらすべてを念頭に置いて、グーグルの一日を自分から救い、髪の一部を保つことができるはずです! ;)
クエリを開始する前にこのコマンドを実行するだけで、すべてのクエリに対してではなく、クエリの前に一度だけ実行する必要があります。
$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;
あなたのbootstrap file ...
$db = Zend_Db::factory($adapter, $config);
$db->query("SET NAMES 'utf8'");
次に、このインスタンスをレジストリに保存します
Zend_Registry::set('db', $db);