Zend_Db_Table UTF-8字符

Ric*_*nop 2 zend-framework zend-db-table zend-db

我的数据库中的表是使用正确的UTF-8字符集创建的,如下所示:

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

但是,当我使用Zend_Db_Table使用此方法从表中获取数据时:

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

它返回一个带有乱糟糟的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();
}
Run Code Online (Sandbox Code Playgroud)

有更好的方法吗?

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);
}
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

Fatal error: Undefined class constant 'MYSQL_ATTR_INIT_COMMAND' in C:\wamp\www\bakalarka\application\Bootstrap.php on line 46
Run Code Online (Sandbox Code Playgroud)

Ale*_*xey 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
Run Code Online (Sandbox Code Playgroud)

注意最后一个参数 然后使用Zend_Config_Ini读取您的配置:

$config = new Zend_Config_Ini('application.ini');
Run Code Online (Sandbox Code Playgroud)

并将数据库参数作为config子对象传递:

$db = Zend_Db::factory($config->db);
Run Code Online (Sandbox Code Playgroud)