ThinkPHP实现多数据库连接的解决⽅法
ThinkPHP实现连接多个数据的时候,如果数据库在同⼀个服务器⾥的话只需要这样定义模型:
class MembersModel extends Model{
protected $trueTableName = 'bers'; //数据库名.表名(包含了前缀)
}
然后就可以像D("Members");这样实例化模型,像普通模型那样操作了。
但后来发现他的数据库在两个不同的服务器,这样上⾯的⽅法就不⾏了。
这时候就需要使⽤TP的多数据连接特性了。
对此,查阅官⽅⽂档进⾏测试并修正之后得出了如下的解决⽅法:
要建⽴多数据连接,⾸先要构造数据库配置参数。但是如果每次都在建⽴多数据库连接的时候都建⽴数据库配置数组,这样就会很⿇烦,还不如写在配置⽂件⾥。这⾥怎么写还是需要有点技巧的。
<?php
$config= array(
'DEBUG_MODE'=>true,
'default_module'=>'Index',
'ROUTER_ON'=>TRUE,
'DATA_RESULT_TYPE'=>1,
'SHOW_RUN_TIME'=>true, // 运⾏时间显⽰
php实例手册'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框架的PHP程序设计有所帮助。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论