- 普通 - 未处理
[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手册一个页面链接的所有数据库,必须使用同一个编码,请在总配置中进行配置即可。
你可以将这些操作封装成一个函数进行更方便的使用。
