代码之家  ›  专栏  ›  技术社区  ›  Hannes

为zend_db设置字符集的最佳方法(或者至少比我目前正在做的更好)

  •  11
  • Hannes  · 技术社区  · 14 年前

    我正在使用zend_db并尝试将字符集更改为utf8,代码如下:

    配置ini:

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

    引导程序.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'");
       }
    }
    

    我认为在配置中添加charset就足够了,但他只会在我直接使用以下命令设置时应用它:

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

    我的问题是:有没有更好的方法来设置字符集,也许是配置方面的?

    2 回复  |  直到 14 年前
        1
  •  17
  •   Surfrdan    14 年前

    首先,我将把您的数据库设置分成它自己的init函数,如下所示:

    /**
     * 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框架中某些常见任务的预定义配置结构。只要在application.ini配置文件中包含以下内容,我们就可以在上面的引导程序中找到资源“db”。

    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-db,但是mysql看起来很相似,但是对于pdo-mysql,dbname不是一个文件路径,而是一个字符串。

    有关资源的更多文档,请参阅:

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

    现在,使用resources config部分agin,我们可以在其中添加以下行来设置数据库字符集,如下所示:

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

    如果您仍然有问题,请看一下Rob Allen在akrabat.com上发布的Zend框架教程博客,以及有关zf资源的utf8和mysql设置的第45条评论。

        2
  •  1
  •   David Kuridža    14 年前

    摘自application.ini:

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