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$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();都可以。
|
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使用者可以根据版本的不同酌情进行相应的调整。
thinkphp实现多数据库操作的更多相关文章
- ThinkPhp框架的数据库操作(查询)
TP框架有一套自己的数据库操作的代码,包括数据库的增.删.改.查.本文主要讲解TP框架的数据库查询操作. 找到入口文件的控制器: 我这里的入口文件是Show文件夹下的控制器. 打开Login控制器. ...
- thinkPHP数据库操作
thinkPHP如果要对数据库操作,一般来说首先要做的是在配置文件中链接数据库,然后用M方法实例化一张表,然后就是对表的操作了 可以开启调试功能查看程序执行的sql语句: 1.开启调试功能(默认是已经 ...
- ThinkPHP 数据库操作(一) : 连接数据库
ThinkPHP内置了抽象数据库访问层,把不同的数据库操作封装起来,我们只需要使用公共的Db类进行操 作,而无需针对不同的数据库写不同的代码和底层实现,Db类会自动调用相应的数据库驱动来处理.采用 P ...
- 扣出thinkphp数据库操作类
假如你是一位thinkphp的使用者,想必你会觉得thinkphp操作数据库非常方便.现在在你面前有一个非常小的作业,小到完全没有必要用thinkphp去完成它.但是你又觉得不用thinkphp的话, ...
- ThinkPHP 学习笔记 ( 三 ) 数据库操作之数据表模型和基础模型 ( Model )
//TP 恶补ing... 一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: publ ...
- ThinkPHP 数据库操作(四) : 聚合查询、时间查询、高级查询
聚合查询 在应用中我们经常会用到一些统计数据,例如当前所有(或者满足某些条件)的用户数.所有用户的最大积分.用户的平均成绩等等,ThinkPHP为这些统计操作提供了一系列的内置方法,包括: 用法示例: ...
- ThinkPHP 数据库操作之数据表模型和基础模型 ( Model )
一.定义数据表模型 1.模型映射 要测试数据库是否正常连接,最直接的办法就是在当前控制器中实例化数据表,然后使用 dump 函数输出,查看数据库的链接状态.代码: public function te ...
- ThinkPhp 3.2 CRUD操作
创建数据对象 ThinkPHP可以帮助你快速地创建数据对象,最典型的应用就是自动根据表单数据创建数据对象,这个优势在一个数据表的字段非常之多的情况下尤其明显. 很简单的例子: // 实例化User模型 ...
- PHP之ThinkPHP框架(数据库)
PHP是网站后台开发语言,其重要的操作对象莫过于数据库,之前有了解过mysqli和pdo,但ThinkPHP的数据库交互必须使用其特定的封装方法,或者可以认为其是对PHP数据库操作的进一步封装,以达到 ...
随机推荐
- 出现“ORA-28000:the account is locked”的解决办法
在Oracle 11g版本中,出于安全的考虑,所有Oracle的默认用户,包括SCOTT用户都被锁定.输入用户名和口令之后,会出现错误“ORA-28000:the account is locked” ...
- ajax 三级联动写法
主页面代码 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF ...
- 【MySQL】源码安装
操作系统:Red Hat Enterprise Linux Server release 6.5 Mysql安装包:mysql-5.6.4-m7.tar.zip,下载地址:http://pan.bai ...
- C#关闭退出线程的几种方法
.Application.Exit(); //强制所有消息中止,退出所有的窗体,但是若有托管线程(非主线程),也无法干净地退出: .System.Environment.Exit(); //无论在主线 ...
- 如何实现MySQL数据库使用情况的审计
如何实现MySQL数据库使用情况的审计 最佳答案 mysql的审计功能 mysql服务器自身没有提供审计功能,但是我们可以使用init-connect + binlog的方法进行mysql的操 ...
- 【sqli-labs】 less5 GET - Double Injection - Single Quotes - String (双注入GET单引号字符型注入)
双注入查询可以查看这两篇介绍 https://www.2cto.com/article/201302/190763.html https://www.2cto.com/article/201303/1 ...
- sql_3 join
http://www.cnblogs.com/rush/archive/2012/03/27/2420246.html
- struts与spring整合
Spring与Struts框架整合 Spring,负责对象对象创建 Struts, 用Action处理请求 Spring与Struts框架整合, 关键点:让struts框架action对象的创建,交给 ...
- charles修改下行参数
1.charles抓包修改下行参数: 想要修改的手机展示展示信息页: 2.charle设置断点,在请求接口上一个上设置断点 菜单proxy->Breadkpoints Settings设置打开断 ...
- 【VIP视频网站项目一】搭建视频网站的前台页面(导航栏+轮播图+电影列表+底部友情链接)
首先来直接看一下最终的效果吧: 项目地址:https://github.com/xiugangzhang/vip.github.io 在线预览地址:https://xiugangzhang.githu ...