【Bug】【TP3.2.3】表名相同库名不同配置不同数据源M方法的Bug

浏览:2217 发布日期:2015/09/03 分类:求助交流 关键字: 表同库不同
最近在做一个项目涉及到数据迁移问题,发现了Tp中的Model.class.php文件的一个重大bug
重现条件和步骤:
入口文件关闭调试模式,即 APP_DEBUG 定义为True
配置模型开启字段缓存,即'DB_FIELDS_CACHE' => true,
运行结果见下图(字段是不一样的,但是现在看到的却一样):


第二次还是把入口文件关闭调试模式,即 APP_DEBUG 定义为True
与第一次不同的是关闭模型字段缓存,即'DB_FIELDS_CACHE' => false,
运行结果居然神奇的正确了见下图:


最后无奈看了下Tp的Model.class.php文件    public function __construct($name='',$tablePrefix='',$connection='') {
        // 模型初始化
        $this->_initialize();
        // 获取模型名称
        if(!empty($name)) {
            if(strpos($name,'.')) { // 支持 数据库名.模型名的 定义
                list($this->dbName,$this->name) = explode('.',$name);
注意这行(源文件的 Line 78) list($this->dbName,$this->name) = explode('.',$name);如果在数据源中定义数据库名字,这里是不会被覆盖的,这个暂且不说,关键是后面两个地方的 dbName

源文件的 Line 111的代码 从 C('DB_NAME') 这里获值,如果是从数据源设置怎么办? $db   =  $this->dbName?:C('DB_NAME');同理,源文件的 Line 165 行的 也是同样的问题$db   =  $this->dbName?:C('DB_NAME');以下是个人的建议:
是否建立一个getDbName的方法来统一获取dbName ??


本次用到的代码都在附件的test.tar.gz文件里面
附件根目录下的db.sql是本次演示的数据库sql文件,带 create database 语句,如下所示CREATE DATABASE IF NOT EXISTS `db1` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `db1`;
CREATE TABLE `t_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `user_name` varchar(20) NOT NULL,
 `user_password` varchar(32) NOT NULL,
 `age` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;


CREATE DATABASE IF NOT EXISTS `db2` DEFAULT CHARACTER SET latin1 COLLATE latin1_swedish_ci;
USE `db2`;
CREATE TABLE `t_user` (
 `id` int(11) NOT NULL AUTO_INCREMENT,
 `name` varchar(20) NOT NULL,
 `pwd` varchar(32) NOT NULL,
 `age` int(11) NOT NULL,
 PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

附件 test.tar.gz ( 853.64 KB 下载:6 次 )

最佳答案
评论( 相关
后面还有条评论,点击查看>>