Chinaunix首页 | 论坛 | 博客
  • 博客访问: 543280
  • 博文数量: 119
  • 博客积分: 3167
  • 博客等级: 中校
  • 技术积分: 1215
  • 用 户 组: 普通用户
  • 注册时间: 2005-12-20 21:21
文章分类

全部博文(119)

文章存档

2015年(21)

2012年(4)

2011年(1)

2007年(11)

2006年(50)

2005年(32)

分类: PHP

2015-09-05 21:24:15

获取数据表 "[members]" 的元数据时发生错误.
异常的详细内容: exception 'FLEA_Db_Exception_MetaColumnsFailed' with message '获取数据表 "[members]" 的元数据时发生错误.' in Db\TableDataGateway.php:2000


当调用 $tb = & FLEA::getSingleton('Table_test'); 生成一个table对象


TableDataGateway.php:2000 行附近调用的语句是


$this->dbo->metaColumns($this->qtableName);


底层调用mssql接口, 在文件db\driver\mssql.php中查看metaColumns函数
把SQL的原始语句打印出来看看
$table = $this->qtable($table);echo sprintf($this->META_COLUMNS_SQL, $table, $table);exit;


结果发现$this->META_COLUMNS_SQL , 查询的表名带中括号?   而且把打印出来的一长串的原始语句复制到SQL SERVER里执行,也错误, 但是去掉中括号就能正确执行了。。。


在 mssql.php中查看metaColumns函数


function metaColumns($table)


传入的表名不正确? 或者被更改?   而metaColumns($table)函数的内部并没有对这个表名进行更改的操作




就是说TableDataGateway.php调用的时候传入的表名错误?
$this->dbo->metaColumns($this->qtableName);
发现表名相关的除$this->qtableName外还有个$this->fullTableName


结果把调用传参换成fullTableName, 居然就能正确执行了, 而且打印出来的SQL语句中fullTableName是没有中括号的




而这个TableDataGateway文件里的SQL相关操作语句里调用传参都是用的qtableName,


进而查看到


function setDBO(& $dbo)函数里面的 qtableName的生成:


$this->qtableName = $dbo->qtable($this->fullTableName, $this->schema);




可以看出qtableName是调用数据库访问对象dbo->qtable函数返回的,是属于相关的数据库驱动类文件里面的一个函数


db\driver\mssql.php中qtable函数


    function qtable($tableName, $schema = null)
    {
        return $schema != '' ? "[{$schema}].[{$tableName}]" : "[{$tableName}]";
    }


可见就是这个地方qtable函数对表名操作加上了中括号,  但实际测试的时候sql server里面表名不能加中括号啊,为什么这个地方对表名进行转换还特地加上呢?
先不管为什么,直接修改吧




对比查看了下mysql的重载里面是加反单引号这个是正常的, oracle.php文件里的重载是没有加这些特殊符号的,于是COPY过来改成如下就正常了
return $schema != '' ? "{$schema}.{$tableName}" : $tableName;




这个问题的解决也可以看出流程, 是通过TableDataGateway文件里面生成dbo对象来调用底层的数据库接口类, 包括数据库的关联等逻辑操作都是在TableDataGateway这个文件里面调用


阅读(643) | 评论(0) | 转发(0) |
0

上一篇:php 访问 SQL SERVER

下一篇: fleaphp mssql 2

给主人留下些什么吧!~~