【问题标题】:Cakephp 1.3.14 not loading database schemaCakephp 1.3.14 未加载数据库模式
【发布时间】:2012-07-17 09:19:08
【问题描述】:

我们最近对我们的网站进行了一些更改,以便为预制作做好准备:

  • 迁移到负载平衡架构
  • 现在使用 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

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

有什么想法吗?

【问题讨论】:

  • 首先:使用版本控制,然后您可以回滚(并且更好地跟踪)这样的更改。其次,您是否打开了调试以确保它不是缓存问题?开启它会使模型缓存每 10 秒失效一次,因此它会清除任何坏缓存。
  • 您提供的数据库连接字符串似乎有问题。在调试模式下检查。

标签: mysql sql cakephp cakephp-1.3


【解决方案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 权限

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-09
    • 1970-01-01
    • 1970-01-01
    • 2014-01-30
    • 1970-01-01
    相关资源
    最近更新 更多