用ThinkPHP多数据库连接的解决方案

当thinkphp实现多个数据连接,如果数据库在同一台服务器,它只需要定义模型。


类membersmodel延伸模型{
保护truetablename = Members'美元。成员; / /数据库名称。表的名称(包括前缀)
}


然后它可以像D(成员);这实例化模型,像一个普通的模型。

但是后来发现他的数据库在两个不同的服务器中,所以上述方法是不可能的。

这一次,您需要使用TP的多数据连接特性。

在这方面,经过对官方文件的测试和修正,获得了以下解决方案:

要构建多个数据连接,首先应该构造数据库配置参数。但是,如果每次设置多数据库连接时设置数据库配置数组,那么在配置文件中编写它就麻烦多了。




< PHP
数组(
debug_mode= >真的,
default_module= > 'index,
router_on= >真的,
data_result_type= > 1,
show_run_time= >真 / /运行时间显示
show_adv_time= >真 /显示详细的运行时间
show_db_times= >真 / /显示数据库查询和写入数
show_cache_times= >真 / /显示缓冲区的操作次数
show_use_mem= >真 / /显示内存开销
html_file_suffix= >。shtml / /默认静态文件后缀
html_cache_on= >假 / /默认静态缓存
html_cache_time= > 60 / /静态缓存是有效的
html_read_type= > 1,静态缓存0 ReadFile / 1重定向
html_url_suffix= >。shtml / /设置伪静态后缀
默认数据库链接
db_type= > 'mysql,
db_host= > 'localhost,
db_name= >新闻,
db_user= > 'root,
db_pwd= > '123,
db_port= > '3306,
db_prefix= > 'news_,
第一个数据库连接
db_bbs= >阵列(
数据库= > 'mysql,
用户名= > 'discuz,
密码= > '123,
主机名= > 'localhost,
hostport= > '3306,
'数据库' = > 'discuz
),
第二个数据库链接,
db_news= >阵列(
数据库= > 'mysql,
用户名= > 'root,
密码= > '123,
主机名= > 'localhost,
hostport= > '3306,
'数据库' = >新闻

);
返回的配置;
>


在这一点上我们可以用C(db_bbs )和C(db_news )获取数据库配置阵列。

配置良好,现在需要实例化模型。因为我们的模型需要两个不同的数据库连接。项目的配置文件的默认数据库配置。如果你建立了一个表的模型,如UserModel.class.php,

如果你使用D(用户),但是如果当前的默认数据库中没有用户表,它将被报告错误,所以我们要建立一个空模型,没有选择空模型。

建立空模型的方法有两种。


$ = d();


实例化后的模型,我们需要添加的数据库模型。


$道-> addconnect(C(db_bbs ),1,真的);
$道-> addconnect(C(db_news ),2,真的);


说这addconnect();这个函数的原型是不同的从1.0.3、1.0.4。

1.0.3原型:




布尔addconnect(混合配置混合linknum美元,美元,美元eqtype =真} {布尔)


在1.0.4原型:




布尔addconnect(混合配置混合linknum美元,美元)


缺少第三个参数。

第一个参数是数据库的配置数组。第二个参数是要添加的连接的数量。当数据库连接被切换时,需要给出该序列号的连接。请注意,内置数据库连接序列号是0,因此额外的数据库连接序列号应该从1开始。第三个参数是两个数据库是否是相同的连接,这是真的。

添加数据库连接后,你可以在任何时候切换数据库连接。例如,我们要用db_news数据库。


美元switchconnect道>>(2);


因为这只是连接到数据库,没有表选择,所以您需要选择下一个表。

注意,这里的表的名称是全名,也就是表的前缀和表名。因为我们在连接数据库的配置数组中没有前缀。我认为应该定义它,但我不知道。


$道->表格(cdb_members );


然后你可以像普通的模型那样使用这个模型。

例如,我想查询通过的ID用户的所有信息:


$地图=阵列(ID= > $ _get {ID));
$ $ = DAO -查找($ map);


您可以看到查询是否成功。


倾销(美元);


如果你想使用db_bbs数据库表了,你只需要切换一个连接。


美元switchconnect道>>(2);


然后选择查询表。记住,切换模型必须选择一个表,否则会出错。

然后可以像普通模型一样运行。

手册中指出了以下问题。

1。当实例化多数据库连接时,建立一个非空模型(这似乎是错误的)。这可能会出错。建议建立一个空模型。

2.addconnect()的参数在不同版本的不同,它们不是写在手册。

三.设置了一个空模型后,需要选择一个不在本手册中的表。

对于以上几点,ThinkPHP用户可以进行相应的调整,根据不同的版本。