Zend framework Zend_Db_表格UTF-8字符

Zend framework Zend_Db_表格UTF-8字符,zend-framework,zend-db,zend-db-table,Zend Framework,Zend Db,Zend Db Table,我的数据库中的表是使用正确的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)

我的数据库中的表是使用正确的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();
}
$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 );
有更好的办法吗

更新2:

我试过这个:

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

我猜你在用MySQL?据我所知,强制它返回UTF-8数据的唯一方法是打开DB连接并运行以下查询:

SET NAMES 'utf8'
或者,如果您正在使用mysqli扩展:

mysqli_set_charset('utf8');
也应该有效…

是正确的。但是,通过使用Zend_Db factory方法的
driver_options
选项,可以在不显式执行查询的情况下实现这一点。我假设您使用
pdo_mysql
适配器,并使用Zend_Db的工厂方法对其进行实例化

您可以使用此工厂方法向适配器传递一组附加选项。您要查找的
pdo_-mysql
选项是pdo的
mysql_ATTR_INIT_命令

下面是它的工作原理:

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();
}
$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 );
如您所见,我们能够利用PDO的
MYSQL\u ATTR\u INIT\u命令
选项。您可能知道此常量在
.ini
配置中不可用。因此,如果从
.ini
文件中读取db适配器配置设置,则必须使用
.ini
文件中常量的具体值,或者在执行时将驱动程序选项数组追加/合并到factory方法参数中(我就是这样做的):

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

我假设这是完全可能的,只需将一个参数传递给工厂方法,就像您在示例中所做的那样。我只是习惯了将两个参数传递给工厂方法。

不必设置驱动程序选项,您可以轻松地执行以下操作

您的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');
并将数据库参数作为配置子对象传递:

$db = Zend_Db::factory($config->db);

是的,我正在起诉MySQL。我去试试。请看我的答案,另一种方式,你可能会觉得更方便。不确定这是否适用于你的设置,但我只是读了一些关于PHP错误的故事(),其中在某些版本中,
MYSQL\u ATTR\u INIT\u命令
不可用:(您可以尝试使用具体的值
1002
,但是一些消息报告说它也不起作用。或者您应该升级您的设置。但不确定您是否认为它值得这么做。似乎是这样,我正在运行PHP5.3.0,虽然它是最新的版本,所以我不知道。无论如何,我必须执行“设置名称‘utf8’”查询。对我来说也很有效,这里的最佳解决方案是IMHO