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

Model:

namespace Shebao\Model;

use Common\Model\CommonModel;

class CeshiModel extends CommonModel{

protected $trueTableName = 'shebao.sb_person'; //数据库名.表名(包含了前缀)

public function index()

{

}

}

Controller:

public function index(){

$ceshi = D('Shebao/Ceshi');

$data = $ceshi->where(['id'=>'86368'])->find();

dump($data);die;

}

然后就可以像D('Shebao/Ceshi');这样实例化模型,像普通模型那样操作了。

2.数据库在两个不同的服务器,这样上面的方法就不行了:

这时候就需要使用TP的多数据连接特性了。

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

要建立多数据连接,

首先要构造数据库配置参数。

但是如果每次都在建立多数据库连接的时候都建立数据库配置数组,这样就会很麻烦,还不如写在配置文件里。

这里怎么写还是需要有点技巧的。

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

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

$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(1);

然后再选表查询。记住,切换模型后一定要再选一次表,不然会出错。

之后又可以像普通模型那样操作了。

下面针对手册指出里面存在的几处问题:

1.实例化多数据库连接的时候建立了个非空的模型。(好像还写错了。)这样可能会出错。建议建立空模型;

2.addConnect()的参数在不同的版本是不同的,手册中没写出来;

3.建立了空模型后需要选表,这个手册里没有。

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

多个php 链接数据库,ThinkPHP实现多数据库连接的解决方法相关推荐

  1. mysql5.7更改数据库存储位置_mysql 5.7更改数据库的数据存储位置的解决方法

    随着mysql数据库存储的数据逐渐变大,已经将原来的存储数据的空间占满了,导致mysql已经链接不上了.因此,必须要给存放的数据换个地方了.下面是操作过程中的一些步骤.记下来,以后日后查看. 1.修改 ...

  2. (转)SQL Server数据库复制错误的原因及解决方法

    在使用SQL Server数据库中,有时在复制时会出现错误,下面就为你分类介绍SQL Server数据库复制错误的原因及解决方法,希望对您学习SQL Server数据库有所帮助. 错误 消息 MSSQ ...

  3. Mysql 数据库锁表的原因和解决方法

    Mysql 数据库锁表的原因和解决方法 参考文章: (1)Mysql 数据库锁表的原因和解决方法 (2)https://www.cnblogs.com/xinruyi/p/11108795.html ...

  4. windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法

    windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法 参考文章: (1)windows下本地或者远程连接MYSQL数据库,报1130错误的解决方法 (2)https://www. ...

  5. SQL Server2008附加数据库之后显示为只读时解决方法

    SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...

  6. mysql 自动停止_MySQL数据库之mysql自动停止的完美解决方法

    本文主要向大家介绍了MySQL数据库之mysql自动停止的完美解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 这两天新买的服务器mysql总是自动停止,查了日志 9:1 ...

  7. (转载)SQL Server2008附加数据库之后显示为只读时解决方法

    SQL Server2008附加数据库之后显示为只读时解决方法 啰嗦的话就不多说了,直入主题吧! 方案一: 碰到这中情况一般是使用的sa账户登录的,只要改为Windows身份验证,再附加数据库即可搞定 ...

  8. 登陆SQL Server 2000数据库提示超时已过期的解决方法

    登陆SQL Server 2000数据库提示超时已过期的解决方法 参考文章: (1)登陆SQL Server 2000数据库提示超时已过期的解决方法 (2)https://www.cnblogs.co ...

  9. mysql数据库主从不同步_MySQL数据库之mysql主从数据库不同步的2种解决方法

    本文主要向大家介绍了MySQL数据库之mysql主从数据库不同步的2种解决方法 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. 今天发现Mysql的主从数据库没有同步 先上Mas ...

最新文章

  1. map平均准确率_MAP(Mean Average Precision)
  2. 今天看到这篇新闻之后,决定休息一下咯
  3. 改变MATLAB仿真出来的图的线条颜色表
  4. android自定义进度条渐变色View,不使用任何图片资源
  5. ABAP中怎样获取随机数
  6. 睡眠经济的尽头,会是智能床垫吗?
  7. 属于服务器端运行的程序_Telerik UI for ASP.NET MVC:为任何设备以两倍的速度构建功能丰富且响应迅速的web应用程序...
  8. spring health_为什么Spring的Health会再次向下,向下,向上,向上,向上和向下?...
  9. jQuery 1.6 中更新的几个功能
  10. 开发一个Swing功能时的一点总结
  11. 文件和目录操作命令(19 个)--14.dirname
  12. java中构造函数有什么用,java中的构造函数有什么用?用它有什么好处?在什么地方用?...
  13. 【MATLAB数据分析】01数据的均值、变异度、偏度和峰度
  14. 有序回归: Ordinal Regression的理解
  15. 华为应用市场业务介绍
  16. 主打“极致性价比”的酷玩7,能否让酷派再现辉煌?
  17. 三次握手与四次挥手过程详解
  18. Ubuntu16.04升级 Ubuntu18.04
  19. XP中服务与后门技术
  20. Doxygen一个程序的文件产生工具

热门文章

  1. Delphi中动态调用DLL的方法
  2. oracle数据库卸载(需要完全卸载oracl才能重装)
  3. 状态压缩 之 UVA 10944 - Nuts for nuts..
  4. 数据库设计器无法打开方法
  5. dm365工作笔记20130731
  6. 2010年 Web的五项技术和五个趋势
  7. 在asp.net 2.0中使用SqlBulkCopy类迁移数据[转]
  8. 数据库基础知识——DDL语言
  9. 计算机网络——标准化工作及相关组织
  10. 计算机网络(八)-数据链路层-帧封装