ThinkPHP实现多数据库连接的解决方法 |
ThinkPHP实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型: class MembersModel extends Model{ protected $trueTableName = members.members; //数据库名.表名(包含了前缀) } 然后就可以像D("Members");这样实例化模型,像普通模型那样操作了 。 对此,查阅官方文档进行测试并修正之后得出了如下的解决方法: 要建立多数据连接,首先要构造数据库配置参数 。但是如果每次都在建立多数据库连接的时候都建立数据库配置数组,这样就会很麻烦,还不如写在配置文件里 。这里怎么写还是需要有点技巧的 。 <?php $config= array( DEBUG_MODE=>true, default_module=>Index, ROUTER_ON=>TRUE, DATA_RESULT_TYPE=>1, SHOW_RUN_TIME=>true, // 运行时间显示 SHOW_ADV_TIME=>true, // 显示详细的运行时间 SHOW_DB_TIMES=>true, // 显示数据库查询和写入次数 SHOW_CACHE_TIMES=>true, // 显示缓存操作次数 SHOW_USE_MEM=>true, // 显示内存开销 HTML_FILE_SUFFIX=>.shtml, // 默认静态文件后缀 HTML_CACHE_ON =>false, // 默认关闭静态缓存 HTML_CACHE_TIME=>60, // 静态缓存有效期 HTML_READ_TYPE=>1, // 静态缓存读取方式 0 readfile 1 redirect HTML_URL_SUFFIX=>.shtml, // 伪静态后缀设置 //默认数据库链接 DB_TYPE=>mysql, DB_HOST=>localhost, DB_NAME=>news, DB_USER=>root, DB_PWD=>123, DB_PORT=>3306, DB_PREFIX=>news_, //我的第一个数据库连接 DB_BBS=>array( dbms => mysql, username => discuz, password => 123, hostname => localhost, hostport => 3306, database => discuz ), //第二个数据库链接, DB_NEWS=>array( dbms=>mysql, username=>root, password=>123, hostname=>localhost, hostport=>3306, database=>news ) ); return $config; ?> 至此我们就可以用C("DB_BBS")和C("DB_NEWS")来得到数据库的配置数组 。 $dao=D(); 实例化模型后,我们需要增加数据库模型; $dao->addConnect(C("DB_BBS"),1,true); $dao->addConnect(C("DB_NEWS"),2,true); 说一下这个addConnect();这个函数的原型在1.0.3和1.0.4是有区别的 。 boolean addConnect (mixed $config, mixed $linkNum, [boolean $eqType = true]) 在1.0.4的原型是: boolean addConnect (mixed $config, mixed $linkNum) 少了第三个参数 。 添加完数据库连接后,就可以随时切换数据库连接了 。比如我们这要用DB_NEWS这个数据库,就这么写: $dao->switchConnect(2); 因为这里只是建立了数据库的连接,并没有选表,所以接下来需要选表 。 $dao->table("cdb_members"); 之后就可以像普通模型一样的用这个模型了 。 $map=array("id"=>$_GET["id"]); $res=$dao->find($map); 可以看看查询是否成功了 。 dump($res); 如果你现在要用DB_BBS的数据库的表,只需再切换一次连接; $dao->switchConnect(2); 然后再选表查询 。记住,切换模型后一定要再选一次表,不然会出错 。 1.实例化多数据库连接的时候建立了个非空的模型 。(好像还写错了 。)这样可能会出错 。建议建立空模型; 针对以上几点,ThinkPHP使用者可以根据版本的不同酌情进行相应的调整 。 |