ThinkPHP实现多数据库连接的解决方法
ThinkPHP  /  管理员 发布于 8年前   190
ThinkPHP实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型: 然后就可以像D("Members");这样实例化模型,像普通模型那样操作了。 对此,查阅官方文档进行测试并修正之后得出了如下的解决方法: 要建立多数据连接,首先要构造数据库配置参数。但是如果每次都在建立多数据库连接的时候都建立数据库配置数组,这样就会很麻烦,还不如写在配置文件里。这里怎么写还是需要有点技巧的。 至此我们就可以用C("DB_BBS")和C("DB_NEWS")来得到数据库的配置数组。 实例化模型后,我们需要增加数据库模型; 说一下这个addConnect();这个函数的原型在1.0.3和1.0.4是有区别的。 在1.0.4的原型是: 少了第三个参数。 添加完数据库连接后,就可以随时切换数据库连接了。比如我们这要用DB_NEWS这个数据库,就这么写: 因为这里只是建立了数据库的连接,并没有选表,所以接下来需要选表。 之后就可以像普通模型一样的用这个模型了。 可以看看查询是否成功了。 如果你现在要用DB_BBS的数据库的表,只需再切换一次连接; 然后再选表查询。记住,切换模型后一定要再选一次表,不然会出错。 1.实例化多数据库连接的时候建立了个非空的模型。(好像还写错了。)这样可能会出错。建议建立空模型; 针对以上几点,ThinkPHP使用者可以根据版本的不同酌情进行相应的调整。 更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教程》、《thinkPHP模板操作技巧总结》、《ThinkPHP常用方法总结》、《smarty模板入门基础教程》及《PHP模板技术总结》。 希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。class MembersModel extends Model{protected $trueTableName = 'members.members'; //数据库名.表名(包含了前缀)}
但后来发现他的数据库在两个不同的服务器,这样上面的方法就不行了。
这时候就需要使用TP的多数据连接特性了。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;?>
配置好了,现在需要实例化模型。因为我们这个模型需使用两个不同的数据库的连接,项目的配置文件里默认了个数据库配置,如果你建立了某个表的模型比如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);
在1.0.3的原型是:boolean addConnect (mixed $config, mixed $linkNum, [boolean $eqType = true])
boolean addConnect (mixed $config, mixed $linkNum)
第一个参数是数据库的配置数组,第二个参数是添加的连接的编号,这个编号在切换数据库连接的时候需要给出是那个序号的连接。注意内置的数据库连接序号是0,所以额外的数据库连接序号应该从1开始.第三个参数是 如果两个数据库是否是相同的连接,是就是true;$dao->switchConnect(2);
注意这里的表名是全名,即表的前缀加表名。因为我们在连接数据库的配置数组里没前缀。我觉得应该可以定义,但我不知道。现在就这样了。$dao->table("cdb_members");
比如我要查询传递过来的ID的用户的所有信息 :$map=array("id"=>$_GET["id"]);$res=$dao->find($map);
dump($res);
$dao->switchConnect(2);
之后又可以像普通模型那样操作了。
下面针对手册指出里面存在的几处问题:
2.addConnect()的参数在不同的版本是不同的,手册中没写出来;
3.建立了空模型后需要选表,这个手册里没有。您可能感兴趣的文章:
122 在
学历:一种延缓就业设计,生活需求下的权衡之选中评论 工作几年后,报名考研了,到现在还没认真学习备考,迷茫中。作为一名北漂互联网打工人..123 在
Clash for Windows作者删库跑路了,github已404中评论 按理说只要你在国内,所有的流量进出都在监控范围内,不管你怎么隐藏也没用,想搞你分..原梓番博客 在
在Laravel框架中使用模型Model分表最简单的方法中评论 好久好久都没看友情链接申请了,今天刚看,已经添加。..博主 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 @1111老铁这个不行了,可以看看近期评论的其他文章..1111 在
佛跳墙vpn软件不会用?上不了网?佛跳墙vpn常见问题以及解决办法中评论 网站不能打开,博主百忙中能否发个APP下载链接,佛跳墙或极光..
Copyright·© 2019 侯体宗版权所有·
粤ICP备20027696号