Zend_Db_Table UTF-8 символов - PullRequest
       20

Zend_Db_Table UTF-8 символов

2 голосов
/ 11 февраля 2010

Таблицы в моей базе данных создаются с использованием правильной кодировки 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), поэтому я не знаю, в чем проблема.

Как я могу решить эту проблему?

UPDATE:

Итак, я сделал это, и это работает:

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

Ответы [ 3 ]

13 голосов
/ 10 февраля 2011

Вместо установки 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);
3 голосов
/ 11 февраля 2010

Wim правильно.Однако есть способ сделать это без явного выполнения запроса, используя опцию driver_options для фабричного метода Zend_Db.Я предполагаю, что вы используете адаптер pdo_mysql и создаете его экземпляр фабричным методом Zend_Db.

Вы можете передать дополнительный набор опций адаптеру с помощью этого заводского метода.Опция для pdo_mysql, которую вы ищете, - это MYSQL_ATTR_INIT_COMMAND.

PDO. Вот как это работает:

$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 );

Как видите, мы можем использовать * 1014 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' ) )
);

РЕДАКТИРОВАТЬ
Я предполагаю, что это вполне возможно, передав только один аргумент фабричному методу, как вы делаете в своем примере, также.Я просто привык к передаче двух аргументов фабричному методу.

3 голосов
/ 11 февраля 2010

Я полагаю, вы используете MySQL?Единственный известный мне способ заставить его возвращать данные UTF-8 - открыть соединение с БД и выполнить следующий запрос:

SET NAMES 'utf8'

или, если вы используете расширение mysqli:

mysqli_set_charset('utf8');

должно работать так же ...

...