tp2.1 自己修改的多数据库连接和切换,可以正常使用

浏览:1454 发布日期:2011/09/04
- 普通 - 未处理
[i=s] 本帖最后由 yanlin 于 2011-9-4 22:08 编辑 [/i]

tp2.1延续tp2.0的问题,多数据库切换,根本不考虑数据库的类型,前缀,编码问题。所以基本上多数据库切换等于是没有用的功能。

提了多次意见了,官方不给任何答复,没有办法,只有自己修改内核了。

如果有朋友需要用到多数据库,特别是mysql与sqlite之间切换的,其他数据库也可以,其dsn配置并不一样,tp默认的dsn解析并不能很好的支持sqlite

想在一个页面内同时连接多个mysql,sqlite或其他数据库的例子。

修改内核 Lib\Think\Db\Db.class.php 找到162行private function parseConfig将这个函数全部修改为    private function parseConfig($db_config='') {
      if(is_array($db_config)){
             $db_config = array(
                  'dbms'        => $db_config['DB_TYPE'],
                  'username'  => $db_config['DB_USER'],
                  'password'   => $db_config['DB_PWD'],
                  'hostname'  => $db_config['DB_HOST'],
                  'hostport'    => $db_config['DB_PORT'],
                  'database'   => $db_config['DB_NAME'],
                  'dsn'   => $db_config['DB_DSN'],
                  'params'   => $db_config['DB_PARAMS'],
             );
     }else{
            $db_config = array (
                'dbms'        =>   C('DB_TYPE'),
                'username'  =>   C('DB_USER'),
                'password'   =>   C('DB_PWD'),
                'hostname'  =>   C('DB_HOST'),
                'hostport'    =>   C('DB_PORT'),
                'database'   =>   C('DB_NAME'),
                'dsn'          =>   C('DB_DSN'),
                'params'     =>   C('DB_PARAMS'),
            );
      }
        return $db_config;
}
修改内核 Lib\Think\Core\Model.class.php 找到1056行public function db($linkNum,$config=''){在下面添加$this->tablePrefix = $config['DB_PREFIX'];经过以上修改后,转换数据库不再用dsn进行配置,而是使用数组,例子如下
//连接到第1个mysql数据库
$db_config = array('DB_TYPE'=>'mysqli','DB_USER'=>'cncom_f','DB_PWD'=>'pgfht3567','DB_HOST'=>'localhost','DB_PORT'=>'3306','DB_NAME'=>'656546','DB_PREFIX'=>'cdb_','DB_DSN'=>'');
$DATABASE = M();
$LIST = $DATABASE->db(1, $db_config)->table('usergroups')->order('groupid desc')->select();

//连接到第2个mysql数据库
$db_config = array('DB_TYPE'=>'mysqli','DB_USER'=>'fghdfh_f','DB_PWD'=>'546546546','DB_HOST'=>'localhost','DB_PORT'=>'3306','DB_NAME'=>'fghgfh','DB_PREFIX'=>'','DB_DSN'=>'');
$LIST = $DATABASE->db(2, $db_config)->table('memberfields_proxy_platform')->select();


//连接到第3个sqlite数据库
 $db_config = array('DB_TYPE'=>'pdo','DB_USER'=>'','DB_PWD'=>'','DB_HOST'=>'','DB_PORT'=>'','DB_NAME'=>'','DB_DSN'=>'sqlite:./Data/project_proxy/proxy.db');
$SQLITE = $DATABASE->db(3, $db_config);
$RESULT = $SQLITE->table('memberfields_proxy_platform')->select();

                        
//连接到第4个sqlite数据库
$db_config = array('DB_TYPE'=>'pdo','DB_USER'=>'','DB_PWD'=>'','DB_HOST'=>'','DB_PORT'=>'','DB_NAME'=>'','DB_DSN'=>'sqlite:./Data/project2/all_proxy_lists.db');
$SQLITE = $DATABASE->db(4, $db_config);
$RESULT = $SQLITE->table('all_proxy_lists')->count();
最后要注意的是,切换数据库的表,使用table,具体看tp手册
一个页面链接的所有数据库,必须使用同一个编码,请在总配置中进行配置即可。

你可以将这些操作封装成一个函数进行更方便的使用。

评论(
后面还有条评论,点击查看>>