2

私のデータベースのテーブルは、次のような正しいUTF-8文字セットで作成されています。

CREATE TABLE users (
id INT NOT NULL AUTO_INCREMENT,
...
...
...
...
...
PRIMARY KEY (id)
) ENGINE = INNODB  CHARACTER SET utf8 COLLATE utf8_slovak_ci;

ただし、Zend_Db_Tableを使用して、このメソッドでテーブルからデータをフェッチすると、次のようになります。

public function getSingle($id)
{
    $select = $this->select();
    $where = $this->getAdapter()->quoteInto('id = ?', $id, 'INTEGER');
    $select->where($where);
    return $this->fetchRow($select);
}

UTF-8文字がめちゃくちゃになっているオブジェクトを返します(iso-8859-1に変換されていると思います)。

phpmyadminでデータベースを調べると、すべての文字が正しく表示され、正しいエンコーディング(UTF-8)も表示されるため、どこに問題があるのか​​わかりません。

どうすればこの問題を解決できますか?

アップデート:

だから私はこれをしました、そしてそれはうまくいきます:

protected function _initDb()
{
    $this->configuration = new Zend_Config_Ini(APPLICATION_PATH
                                               . '/configs/application.ini',
                                               APPLICATION_ENVIRONMENT);
    $this->dbAdapter = Zend_Db::factory($this->configuration->database);
    Zend_Db_Table_Abstract::setDefaultAdapter($this->dbAdapter);
    $stmt = new Zend_Db_Statement_Pdo($this->dbAdapter,
                                      "SET NAMES 'utf8'");
    $stmt->execute();
}

もっと良い方法はありますか?

UPDATE2:

私はこれを試しました:

protected function _initDb()
{
    $this->configuration = new Zend_Config_Ini(APPLICATION_PATH
                                               . '/configs/application.ini',
                                               APPLICATION_ENVIRONMENT);
    $this->dbAdapter = Zend_Db::factory($this->configuration->database);
    $this->dbAdapter = Zend_Db::factory($this->configuration->database->adapter,
                                        $this->configuration->database->params->toArray()
                                        + array('driver_options' => array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES 'utf8'")));
    Zend_Db_Table_Abstract::setDefaultAdapter($this->dbAdapter);
}

そして、私はエラーを受け取ります:

Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in C:\wamp\www\bakalarka\application\Bootstrap.php on line 46
4

3 に答える 3

13

driver_optionsを設定する代わりに、次のことを簡単に行うことができます。

あなたのiniファイル:

db.adapter         = Pdo_Mysql
db.params.host     = localhost
db.params.dbname   = mydb
db.params.username = myuser
db.params.password = mypass
db.params.charset  = UTF8

最後のパラメータに注意してください。次に、Zend_Config_Iniを使用して構成を読み取ります。

$config = new Zend_Config_Ini('application.ini');

そして、データベースパラメータをconfigサブオブジェクトとして渡します。

$db = Zend_Db::factory($config->db);
于 2011-02-10T18:46:12.997 に答える
3

Wimは正しいです。driver_optionsただし、 Zend_Dbファクトリメソッドのオプションを使用して、クエリを明示的に実行せずにこれを行う方法があります。pdo_mysqlアダプタを使用し、Zend_Dbのファクトリメソッドを使用してインスタンス化すると仮定します。

このファクトリメソッドを使用して、追加のオプションセットをアダプタに渡すことができます。pdo_mysqlあなたが探しているオプションはPDOMYSQL_ATTR_INIT_COMMANDです。

仕組みは次のとおりです。

$adapterType = 'pdo_mysql';
$adapterConfig = array(
    'host' => 'localhost',
    'dbname' => 'yourdb',
    'username' => 'user',
    'password' => 'yourpassword',
    // here is where the driver options are defined, as an associative array
    'driver_options' => array(
        PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8'
    )
);

$dbAdapter = Zend_Db::factory( $adapterType, $adapterConfig );

MYSQL_ATTR_INIT_COMMANDご覧のとおり、PDOのオプションを利用することができます。この定数は構成では使用できないことをおそらく理解しているでしょう.ini。したがって、ファイルからdbアダプターの構成設定を読み取る場合は.ini、ファイル内の定数の具体的な値を使用するか、.ini後でdriver_options配列を実行時にファクトリメソッド引数に追加/マージする必要があります(これが私が行うことです)。そのようです:

$dbAdapter = Zend_Db::factory(
 $configuration->database->adapter,
 $configuration->database->params->toArray() +
        array( 'driver_options' => array( PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8' ) )
);

編集
これは、例のように、ファクトリメソッドに引数を1つ渡すだけで完全に可能だと思います。ファクトリメソッドに2つの引数を渡す習慣に慣れています。

于 2010-02-11T20:42:19.023 に答える
3

MySQLを使用していると思いますか?UTF-8データを強制的に返すことを私が知っている唯一の方法は、DB接続を開き、次のクエリを実行することです。

SET NAMES 'utf8'

または、mysqli拡張機能を使用している場合:

mysqli_set_charset('utf8');

同様に機能するはずです...

于 2010-02-11T20:21:50.573 に答える