• 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使用者可以根据版本的不同酌情进行相应的调整。

  • 相关阅读:
    PHP与CI学习笔记
    The Sum of the k-th Powers(Educational Codeforces Round 7F+拉格朗日插值法)
    Nastya Hasn't Written a Legend(Codeforces Round #546 (Div. 2)E+线段树)
    Please, another Queries on Array?(Codeforces Round #538 (Div. 2)F+线段树+欧拉函数+bitset)
    Gorgeous Sequence(HDU5360+线段树)
    Subsequence(HDU3530+单调队列)
    Qualification Rounds(Codeforces Round #438 by Sberbank and Barcelona Bootcamp (Div. 1 + Div. 2 combined)+状态压缩)
    Xenia and Weights(Codeforces Round #197 (Div. 2)+DP)
    字节跳动-文远知行杯”广东工业大学第十四届程序设计竞赛
    线段树优化建边
  • 原文地址:https://www.cnblogs.com/liuwenbohhh/p/4380552.html
Copyright © 2020-2023  润新知