Лучший способ установить кодировку для Zend_Db (или, по крайней мере, лучше, чем я сейчас делаю) - PullRequest
11 голосов
/ 16 ноября 2010

Я использую Zend_DB и пытаюсь изменить кодировку на utf8, вот код:

config.ini:

[development]
db.host = "localhost"
db.username = "root"
db.password = "toor"
db.dbname = "db_whoopdiedo"
db.charset = "utf8"

bootstrap.php:

class Bootstrap extends Zend_Application_Bootstrap_Bootstrap
{

    public function _initAutoload() 
    {
        Zend_Registry::set(
            'config',
            new Zend_Config_Ini(APPLICATION_PATH.'/configs/config.ini', 'development')
        );

        Zend_Registry::set(
            'db',
            Zend_Db::factory('Pdo_Mysql', Zend_Registry::get('config')->db)
        );

        Zend_Registry::get('db')->setFetchMode(Zend_Db::FETCH_OBJ);
        Zend_Registry::get('db')->query("SET NAMES 'utf8'");
        Zend_Registry::get('db')->query("SET CHARACTER SET 'utf8'");
   }
}

Я думал, что будет достаточно добавить кодировку в конфиг, но он применяет ее, только если я установлю ее напрямую, используя:

Zend_Registry::get('db')->query("SET NAMES 'utf8'");
Zend_Registry::get('db')->query("SET CHARACTER SET 'utf8'");

Мой вопрос: есть ли лучший способ установитьcharset, может быть, разумно настроить?

Ответы [ 2 ]

17 голосов
/ 16 ноября 2010

Во-первых, я бы разбил настройку вашей базы данных на ее собственную функцию инициализации следующим образом:

/**
 * Initiate Zend Autoloader  
 * @return Zend_Db_Adapter 
 */
protected function _initDatabase() 
{
    $resource = $this->getPluginResource('db');
    $db = $resource->getDbAdapter();
    Zend_Registry::set("db", $db);
    return $db;
}

В приведенном выше примере используются ресурсы, которые являются предопределенными структурами конфигурации для некоторых общих задач в Zend Framework.Просто имея следующее в моем файле конфигурации application.ini, мы можем обратиться к ресурсу 'db' в приведенном выше Bootstrap:

resources.db.adapter = "pdo_sqlite"
resources.db.params.host = "localhost"
resources.db.params.username = "databaseuser"
resources.db.params.password = "mysecretpassword"
resources.db.params.dbname = APPLICATION_PATH "/data/db/ccymod.db"
resources.db.isDefaultTableAdapter = true

Этот пример для базы данных sqlite, но MySQL будет выглядеть аналогично, но сpdo_mysql и имя базы данных - это не путь к файлу, а строка.

Дополнительную документацию по ресурсам можно найти здесь:

http://framework.zend.com/manual/en/zend.application.available-resources.html

Теперь, используя раздел конфигурации ресурсов agin, мы можем добавить к нему следующие строки для установки базы данных.набор символов примерно так:

resources.db.params.charset = "utf8"
resources.db.params.driver_options.1002 = "SET NAMES utf8;"

Если у вас все еще есть проблемы, взгляните на блог-учебник Роба Аллена по Zend Framework на akrabat dot com и комментарии, начиная с номера 45 и далее относительно UTF8 и установки mysqlдля ресурсов ZF.

1 голос
/ 16 ноября 2010

Взято из нашего application.ini:

db.params.driver_options.3 = "SET NAMES 'utf8'"
...