thinkphp实现多数据库操作

这篇文章主要介绍了ThinkPHP实现多数据库连接的解决方法,需要的朋友可以参考下

ThinkPHP实现连接多个数据的时候,如果数据库在同一个服务器里的话只需要这样定义模型:

?


1

2

3

class MembersModel extends Model{

protected $trueTableName = ‘members.members‘; //数据库名.表名(包含了前缀)

}

然后就可以像D("Members");这样实例化模型,像普通模型那样操作了。
但后来发现他的数据库在两个不同的服务器,这样上面的方法就不行了。
这时候就需要使用TP的多数据连接特性了。

对此,查阅官方文档进行测试并修正之后得出了如下的解决方法:

要建立多数据连接,首先要构造数据库配置参数。但是如果每次都在建立多数据库连接的时候都建立数据库配置数组,这样就会很麻烦,还不如写在配置文件里。这里怎么写还是需要有点技巧的。

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

<?php

$configarray(

‘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();都可以。

?


1

$dao=D();

实例化模型后,我们需要增加数据库模型;

?


1

2

$dao->addConnect(C("DB_BBS"),1,true);

$dao->addConnect(C("DB_NEWS"),2,true);

说一下这个addConnect();这个函数的原型在1.0.3和1.0.4是有区别的。
在1.0.3的原型是:

?


1

boolean addConnect (mixed $config, mixed $linkNum, [boolean $eqType = true])

在1.0.4的原型是:

?


1

boolean addConnect (mixed $config, mixed $linkNum)

少了第三个参数。
第一个参数是数据库的配置数组,第二个参数是添加的连接的编号,这个编号在切换数据库连接的时候需要给出是那个序号的连接。注意内置的数据库连接序号是0,所以额外的数据库连接序号应该从1开始.第三个参数是 如果两个数据库是否是相同的连接,是就是true;

添加完数据库连接后,就可以随时切换数据库连接了。比如我们这要用DB_NEWS这个数据库,就这么写:

?


1

$dao->switchConnect(2);

因为这里只是建立了数据库的连接,并没有选表,所以接下来需要选表。
注意这里的表名是全名,即表的前缀加表名。因为我们在连接数据库的配置数组里没前缀。我觉得应该可以定义,但我不知道。现在就这样了。

?


1

$dao->table("cdb_members");

之后就可以像普通模型一样的用这个模型了。
比如我要查询传递过来的ID的用户的所有信息 :

?


1

2

$map=array("id"=>$_GET["id"]);

$res=$dao->find($map);

可以看看查询是否成功了。

?


1

dump($res);

如果你现在要用DB_BBS的数据库的表,只需再切换一次连接;

?


1

$dao->switchConnect(2);

然后再选表查询。记住,切换模型后一定要再选一次表,不然会出错。
之后又可以像普通模型那样操作了。
下面针对手册指出里面存在的几处问题:

1.实例化多数据库连接的时候建立了个非空的模型。(好像还写错了。)这样可能会出错。建议建立空模型;
2.addConnect()的参数在不同的版本是不同的,手册中没写出来;
3.建立了空模型后需要选表,这个手册里没有。

针对以上几点,ThinkPHP使用者可以根据版本的不同酌情进行相应的调整。

时间: 2024-08-30 13:10:47

thinkphp实现多数据库操作的相关文章

ThinkPhp框架的数据库操作(查询)

TP框架有一套自己的数据库操作的代码,包括数据库的增.删.改.查.本文主要讲解TP框架的数据库查询操作. 找到入口文件的控制器: 我这里的入口文件是Show文件夹下的控制器. 打开Login控制器. 代码写在index方法中. 数据库的定义方式有三种. 前两种要写模型函数,最后一种不需要. 模型的例子(放在Model文件夹下,名字与类名相同,本例的名字:UserModel.class.php) <?php namespace Admin\Model; use Think\Model; class

MySQL数据库操作类(PHP实现,支持连贯操作)

使用过ThinkPHP框架的同学可能会对于其中数据库模型操作特别有好感,ThinkPHP提供了数据库操作的简单的操作,对于连接数据库,数据库的增删改查等数据操作都非常的nice,同时支持连贯操作,对于那些不习惯写sql语句的同学真是大大的便利.(注:sql还是很重要的,不要因为用了框架就把原先的忘了). 而在笔者使用php操作redis实现后台任务的过程中,也想要借助这种便利,但无奈redis操作单独的类,直接访问其中的controller文件的话,总是会提示M方法失败,导致此模型方法不能使用.

thinkphp对数据库操作有哪些内置函数

原文:thinkphp对数据库操作有哪些内置函数 getModelName() 获取当前Model的名称 getTableName() 获取当前Model的数据表名称 switchModel(type,vars=array()) 动态切换模型 table() 设置当前操作的数据表 field() 设置要查询的数据字段 where() 设置查询或者操作条件 data(data) 设置数据对象 order(order) 设置排序 limit(limit) 查询限制 page(page) 查询分页 j

扣出thinkphp数据库操作类

假如你是一位thinkphp的使用者,想必你会觉得thinkphp操作数据库非常方便.现在在你面前有一个非常小的作业,小到完全没有必要用thinkphp去完成它.但是你又觉得不用thinkphp的话,操作数据库非常麻烦.这时,你陷入了左右为难的境况.那么,下面我要分享的这个数据库操作类,可能会帮助你摆脱这种困境.这个数据库操作类虽然不能说是完全从thinkphp里扣出来的,但多多少少能看到thinkphp当年的影子,使用起来非常类似,真是方便好用啊.好了,马上来演示一下基本用法吧. 首先来演示一

ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )

//TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function testdb(){ $obj=M("User"); dump($obj); } 此时浏览器输出: object(Model)#5 (20) { ["_extModel:private"] => NULL ["db:protecte

ThinkPHP-基础数据库操作CRUD

参考:http://doc.thinkphp.cn/manual/curd.html ThinkPHP提供了灵活和方便的数据操作方法,对数据库操作的四个基本操作(CURD):创建.更新.读取和删除的实现是最基本的,也是必须掌握的,在这基础之上才能熟悉更多实用的数据操作方法.CURD操作通常是可以和连贯操作配合完成的.下面来分析下各自的用法:(下面的CURD操作我们均以M方法创建模型实例来说明,因为不涉及到具体的业务逻辑) 创建(Create) 在ThinkPHP中使用add方法新增数据到数据库(

thinkphp框架 链接数据库和操作数据

框架有时会用到数据库的内容,在"ThinkPhp框架知识"的那篇随笔中提到过,现在这篇随笔详细的描述下. 一.链接数据库 (1)找到模块文件夹中的Conf文件夹,然后进行编写config.php文件 (2)打开这个config.php文件,然后找到父类配置文件convention.php文件,将关于"数据库"的部分复制粘贴到config.php配置文件中 /* 数据库设置 */    'DB_TYPE'               =>  '',     //

ThinkPHP学习之数据库查询

数据库操作怎么那么复杂,这个条件那个条件的,不过万变不离其宗,只要知道最基本几个查询就可以随便组合了. 连贯查询,不限制次序,挺不错 http://www.thinkphp.cn/info/116.html $User->where('status=1')->order('create_time')->limit(10)->select();

适用于yii1.1的thinkphp化的db操作类

前段时间的一个项目是要对一个用yii1.1写的商城做修改,不怎么好写,不过比面向过程的ecshop好得多,之前刚开始改ecshop还真是头大 yii1.1其中数据库操作花了我不少时间去找各种例子进行测试,出于日后可能还要改的原因,我将数据库的一些操作改成了thinkphp的形式,代码如下 <?php /**gcud数据库操作 * @version 20191231 */ class gcudDb { private $TableName; private $Conditions; private