web-dev-qa-db-ja.com

ZendFrameworkで、接続するたびにPDOでSET NAMES utf8を実行する方法

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

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

40

イタイ、

とてもいい質問です。幸いなことに、答えは非常に簡単です。

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

1002は定数PDO :: MYSQL_ATTR_INIT_COMMANDの値です

Config.iniで定数を使用することはできません

47

私を恐れる google-f

$pdo = new PDO(
    'mysql:Host=mysql.example.com;dbname=example_db',
    "username",
    "password",
    array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8"));

最初のヒット;)

121
SchizoDuckie

これを設定に入れるだけです

database.params.charset = "utf8"

またはZF 1.11以降、これはresources.db.params.charset = utf8 それだ

32
tawfekov

Zend_dbの接続は遅延しているため、最初のクエリで接続します。クエリが含まれていない静的なページがある場合は、接続することさえありません-あなたがbootstrapファイルで初期化されている場合でも。

実行中:

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

それほどスマートではありません。 dcauntのソリューションに感謝します。

4
Leon Fedotov

このすべてのメソッドshoudは、特別な状況を除いて機能します。たとえば、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では問題ではありませんでした)

これらすべてを念頭に置いて、グーグルの一日を自分から救い、髪の一部を保つことができるはずです! ;)

3
mlarcher

クエリを開始する前にこのコマンドを実行するだけで、すべてのクエリに対してではなく、クエリの前に一度だけ実行する必要があります。

$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; 
1
Black

あなたのbootstrap file ...

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

次に、このインスタンスをレジストリに保存します

Zend_Registry::set('db', $db);
0
patchinko