注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

php开发lamp

《西安--木木》-经历丰富了生活。 架构师QQ群: 246695517

 
 
 

日志

 
 

(转)ThinkPHP多数据库连接的方法(纠正文档里面定义的模型)  

2014-02-08 13:38:42|  分类: thinkphp框架 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

  数据库在同一个服务器,这样的话只需要这样定义模型:
  代码: 复制内容到剪贴板
  class MembersModel extends Model{
  protected $trueTableName = 'members.members'; //数据库名.表名(包含了前缀)
  }
  然后就可以像D("Members");这样实例化模型,像普通模型那样操作了。
  但后来发现他的数据库在两个不同的服务器,这样上面的方法就不行了。
  这就需要使用TP的多数据连接特性了。
  看了看文档,照着做了,发现一点也不行。文档有问题。
  我昨晚上测试到1点多,总算搞定了。现在我抽时间把这个写出来,和大家分享。
  Ok,先不说文档,下面看看我是怎么做的。
  要建立多数据连接,首先要构造数据库配置参数。我想如果每次都在建立多数据库连接的时候都建立数据库配置数组,这样很麻烦,我还不如写在配置文件里。这里怎么写还是有点技巧的。
   代码: 复制内容到剪贴板
  <?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();都可以。
  代码: 复制内容到剪贴板
  $dao=D();
  实例化模型后,我们需要增加数据库模型;
  代码: 复制内容到剪贴板
  $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(2);
  然后再选表查询。记住,切换模型后一定要再选一次表,不然会出错。
  之后又可以像普通模型那样操作了。
  下面我指出手册里的几处问题。
  1.实例化多数据库连接的时候建立了个非空的模型。(好像还写错了。)这样可能会出错。建议建立空模型;
  2.addConnect()的参数在不同的版本是不同的,手册中没写出来;
  3.建立了空模型后需要选表,这个手册里没有。
  评论这张
 
阅读(308)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017