获取数据表 "[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这个文件里面调用
阅读(621) | 评论(0) | 转发(0) |