ThinkPHP实现多数据库连接的解决方法
thinkphp实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型:
class membersmodel extends model{ protected $truetablename = 'members.members'; //数据库名.表名(包含了前缀) }
然后就可以像d("members");这样实例化模型,像普通模型那样操作了。
但后来发现他的数据库在两个不同的服务器,这样上面的方法就不行了。
这时候就需要使用tp的多数据连接特性了。
对此,查阅官方文档进行测试并修正之后得出了如下的解决方法:
要建立多数据连接,首先要构造数据库配置参数。但是如果每次都在建立多数据库连接的时候都建立数据库配置数组,这样就会很麻烦,还不如写在配置文件里。这里怎么写还是需要有点技巧的。
<?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")来得到数据库的配置数组。
配置好了,现在需要实例化模型。因为我们这个模型需使用两个不同的数据库的连接,项目的配置文件里默认了个数据库配置,如果你建立了某个表的模型比如usermodel.class.php,
如果你用d("user");但假如当前默认的数据库里没user个表的话就会报错。所以我们要建立个空模型。空模型是不会选表的。
有两种方法建立空模型。$dao=d();和$dao=new model();都可以。
$dao=d();
实例化模型后,我们需要增加数据库模型;
$dao->addconnect(c("db_bbs"),1,true); $dao->addconnect(c("db_news"),2,true);
说一下这个addconnect();这个函数的原型在1.0.3和1.0.4是有区别的。
在1.0.3的原型是:
boolean addconnect (mixed $config, mixed $linknum, [boolean $eqtype = true])
在1.0.4的原型是:
boolean addconnect (mixed $config, mixed $linknum)
少了第三个参数。
第一个参数是数据库的配置数组,第二个参数是添加的连接的编号,这个编号在切换数据库连接的时候需要给出是那个序号的连接。注意内置的数据库连接序号是0,所以额外的数据库连接序号应该从1开始.第三个参数是 如果两个数据库是否是相同的连接,是就是true;
添加完数据库连接后,就可以随时切换数据库连接了。比如我们这要用db_news这个数据库,就这么写:
$dao->switchconnect(2);
因为这里只是建立了数据库的连接,并没有选表,所以接下来需要选表。
注意这里的表名是全名,即表的前缀加表名。因为我们在连接数据库的配置数组里没前缀。我觉得应该可以定义,但我不知道。现在就这样了。
$dao->table("cdb_members");
之后就可以像普通模型一样的用这个模型了。
比如我要查询传递过来的id的用户的所有信息 :
$map=array("id"=>$_get["id"]); $res=$dao->find($map);
可以看看查询是否成功了。
dump($res);
如果你现在要用db_bbs的数据库的表,只需再切换一次连接;
$dao->switchconnect(2);
然后再选表查询。记住,切换模型后一定要再选一次表,不然会出错。
之后又可以像普通模型那样操作了。
下面针对手册指出里面存在的几处问题:
1.实例化多数据库连接的时候建立了个非空的模型。(好像还写错了。)这样可能会出错。建议建立空模型;
2.addconnect()的参数在不同的版本是不同的,手册中没写出来;
3.建立了空模型后需要选表,这个手册里没有。
针对以上几点,thinkphp使用者可以根据版本的不同酌情进行相应的调整。
更多关于thinkphp相关内容感兴趣的读者可查看本站专题:《thinkphp入门教程》、《thinkphp模板操作技巧总结》、《thinkphp常用方法总结》、《smarty模板入门基础教程》及《php模板技术总结》。
希望本文所述对大家基于thinkphp框架的php程序设计有所帮助。