我们最近对我们的网站进行了一些更改,以便为预生产做好准备:
现在,一切正常,直到我们做出一些我们无法回想起的更改导致数据库无法正确加载架构。这是一些调试的输出:
Warning (512): SQL Error: 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '' at line 1 [CORE/cake/libs/model/datasources/dbo_source.php, line 684]
Query: SHOW FULL COLUMNS FROM
Warning (2): Invalid argument supplied for foreach() [APP/models/datasources/dbo/dbo_mysql.php, line 127]
Warning (2): array_keys() expects parameter 1 to be array, boolean given [CORE/cake/libs/model/datasources/dbo_source.php, line 1968]
Notice (8): Trying to get property of non-object [CORE/cake/libs/model/datasources/dbo_source.php, line 812]
Query: SHOW FULL COLUMNS FROM
Query: SHOW FULL COLUMNS FROM
Query: SHOW FULL COLUMNS FROM
Query: SHOW FULL COLUMNS FROM
Query: SHOW FULL COLUMNS FROM
Query: SHOW FULL COLUMNS FROM
如您所见,它没有加载表名。
我们注意到的另一个问题是,在生成查询时,会生成如下:
SELECT Project.id FROM AS Project WHERE 1=1
请注意,没有表名,它只是尝试在空表名上创建别名。
有什么想法吗?
答案 0 :(得分:1)
我们最近对我们的网站进行了一些更改,以便为预生产做好准备:
值得庆幸的是,您可以对代码更改进行版本控制,只需回滚直到找到可用的版本并进行比较即可找到重大变化。使用git,可以使用git bisect轻松完成。
没有?以及..
与任何错误一样 - 第一步应该是查看错误的来源:
// cake/models/datasources/dbo/dbo_mysql.php
$cols = $this->query('SHOW FULL COLUMNS FROM ' . $this->fullTableName($model));
foreach ($cols as $column) { // #127
这里应该清楚的是,Cake无法确定模型的完整表名。
查看fullTableName
的来源:
// cake/libs/model/datasources/dbo_source.php
function fullTableName($model, $quote = true) {
if (is_object($model)) {
$table = $model->tablePrefix . $model->table;
} elseif (isset($this->config['prefix'])) {
$table = $this->config['prefix'] . strval($model);
} else {
$table = strval($model);
}
if ($quote) {
return $this->name($table);
}
return $table;
}
应该很清楚,该模型根据蛋糕没有表格。
常见原因:
useTable
设置为false
describe
权限鉴于问题中的信息 - 最有可能的是第一个原因。