2

我们最近对我们的网站进行了一些更改,以准备进行预生产:

  • 迁移到负载平衡架构
  • 现在使用 memcache/memcached 来维护会话数据
  • 启用 APC

现在,一切正常,直到我们进行了一些我们无法回忆的更改,导致数据库无法正确加载模式。这是一些调试的输出:

    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

请注意,没有表名,它只是尝试在空白表名上创建别名。

有什么想法吗?

4

1 回答 1

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权限

鉴于问题中的信息 - 这很可能是第一个原因。

于 2013-03-18T08:29:01.097 回答