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数据库操作的进一步封装,以达到 ...
随机推荐
- ie8及其以下版本兼容性问题之文本省略
1. 单行文本省略 单行文本省略适用于文本超出内容显示区,则在末尾显示省略号 1.1 普通文本超出省略 普通文本超出显示省略号,示例: .p{ height: 30px line-height: 30 ...
- MacOS 升级后pod 出现的问题
-bash: /usr/local/bin/pod: /System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/ruby: bad ...
- 省市区县的sql语句——区县
DROP TABLE IF EXISTS `area`; CREATE TABLE `area` ( `id` int(11) NOT NULL AUTO_INCREMENT, `code` va ...
- SQLite 在 Android 的应用
Android提供了创建和使用SQLite数据库的API(Application Programming Interface,应用程序编程接口). 在Android系统中,主要由类SQLiteData ...
- 查看SqlServer连接所使用的端口号
最近一个项目里用到了一个插件,在配置时发现连接数据库使用的是JDBC,输入URL时用到了端口号.印象中在使用Sqlserver时貌似没有提到端口号,在网上查阅了一下,记录下来省的忘了 方法是通过内置的 ...
- MFC 缩放和显示IplImage
序言:使用OpenCV嵌入MFC的框内,图像大小不能和框大小进行匹配,因此需要缩放,使图像适用于MFC框. 后来找到了一种新的方法,此方案貌似u已经废弃. (1).在MFC中显示图片 void CAv ...
- web前端技术与原生技术的竞争, 及未来的发展
用户界面领域: web技术与原生技术之争 除了浏览器中运行之外, html5的技术也在app领域和移动端的安卓, iOS, 以及桌面端的window, linux以及OS X展开了竞争. 同样属于用户 ...
- C# 去掉代码前边空格(格式化代码)
private void button1_Click(object sender, EventArgs e) { textBox2.Text = ""; string str = ...
- Python-logging模块的初级使用
这篇文章适合刚接触logging模块,想快速使用 并看到使用效果的童鞋.如果想全面的了解logging模块,请移步~ 直接上代码+注释 #1.导入模块logging import logging #2 ...
- 在Unity中json文件的解析方式
using System.Collections; using System.Collections.Generic; using UnityEngine; using LitJson; using ...