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 

ご覧のとおり、テーブル名をロードしていません。

私たちが気づいたもう 1 つの問題は、クエリが生成されると、次のように生成されることです。

SELECT Project.id FROM AS Project WHERE 1=1

テーブル名がないことに注意してください。空白のテーブル名にエイリアスを作成しようとするだけです。

何かご意見は?

4

1 に答える 1

1

最近、プリプロダクション用にサイトにいくつかの変更を加えました。

ありがたいことに、コードの変更をバージョン管理し、機能するバージョンが見つかるまでロールバックして、重大な変更を見つけるために比較することができます。gitでは、これはgitbisectを使用して簡単に実行できます。

いいえ?上手..

原因をデバッグして特定します

他のエラーと同様に、ステップ1は、エラーの原因を確認することです。

// 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 に答える