konakona
[原创] Thinkphp2.1跨库插入数据问题解决
[原创] Thinkphp2.1跨库插入数据问题解决

今天帮芳芳看一个之前她一直在喊的问题

 

大致上来说就是有一个UserModel extends Model 模型文件,设置了$dbName和$tableName后,在查询的时候都是正常的,但是插入数据的时候会出错。

原因是Thinkphp会自动在create()里的fulsh()函数里,追加config.php配置文件中的默认数据库,所以就变成了 sites_hoteltour_a.sites_hoteltour_b.user_info。

其实a和b都是不同的数据库,它这样搞就成了user_info表成字段了……

 

本来想改它源代码,因为觉得既然可以查到准确数据,为什么就不能insert?这摆明了不对。

但是考虑到如果Thinkphp下一个版本不修复这个问题,我还要再去找出这部分代码来改,岂不是更费劲?

 

上Thinkphp官方论坛,看到一个帖子,有朋友说用$this->addConnect()和$this->switchConnect() 来新增、切换数据库连接。(真的是好麻烦,在Thinkphp2.0中是不存在这样的跨库问题的。

 

但是普通的extends Model是不具备addConnect()这类方法的,需要继承的是AdvModel高级模型类。

 

原来就是这样了,下面我放出我的代码:

 
新建一个通用模型,里面存放一些常用的方法,取名为commonModel.class.php

class commonModel extends AdvModel {     //重点是继承于AdvModel类而非Model类

//获得当前精确时间,非unix时间戳
    /**
     * 通过建立新的数据库连接,实现a库与b库之间切换
     * @param string $aorb
     * @return void
     */
    public function connectDataBase($aorb='b',$table=''){
        $b_connect = array(
            'dbms'     => 'mysql',
            'username' => C('DB_USER'),
            'password' => C('DB_PWD'),
            'hostname' => C('DB_HOST'),
            'hostport' => '3306'
        );

        if($aorb=='a'){
            $b_connect['database'] ='sites_hoteltour_a';
        }else{
            $b_connect['database'] ='sites_hoteltour_b';
        }

        //将这个配置添加到第1个上
        if($this->addConnect($b_connect,1)===false)
            die('无法新增数据库配置!');
        if($this->switchConnect(1)===false)    //并进行配置转换
            die('无法切换数据库!');
    }
...//其他一堆常用代码
}

这里解释一下,addConnect($b_connect,1)这里的1,是指数据库连接序号,默认的数据库连接序号是0而且已经存在,所以这里新建就弄1好了。你也可以用$this->closeConnect(0)关闭原有的连接,将新连接序列号设置为0.

然后根据你的需求,创建一个模型文件

class UserModel extends commonModel{
    protected $tableName = 'user_info';

    public function __construct() {
        parent::__construct();
        $this->connectDataBase('b');
    }
}

2个重点,一个是继承与commonModel类(废话!),一个是$tableName数据表指定。如果没有这个,就会用雷鸣User作为数据表了~这一点跟Thinkphp原来的Model是一样的哦,大家注意下。
好了,有了connectDataBase()方法,我可以随心所欲的在a库与b库之间切换。

还有一个比较简单的方法:

protected $connection = "mysql://root:password@localhost:3306/sites_hoteltour_b";

不过这个方法也是可圈可点的~大家各取所需吧。
欢迎大家拍砖,给出不同处理方案。
 

赞赏
https://secure.gravatar.com/avatar/3b712b34a0e1b689cfb524c9c6bcdc47?s=256&r=g

团哥

文章作者

继续玩我的CODE,让别人说去。 低调,就是这么自信。

发表评论

textsms
account_circle
email

konakona

[原创] Thinkphp2.1跨库插入数据问题解决
今天帮芳芳看一个之前她一直在喊的问题。   大致上来说就是有一个UserModel extends Model 模型文件,设置了$dbName和$tableName后,在查询的时候都是正常的,但是插入数据的…
扫描二维码继续阅读
2011-09-20