0

Kohana データベースに問題があります。たまにエラー出ます

ErrorException [ Recoverable Error ] 
Argument 1 passed to Kohana_Database_Query_Builder_Select::compile() must be an instance of Database, string given, called in /srv/sites/mysite/www/modules/database/classes/kohana/database/query.php on line 230 and defined

これは、Database:$instances に文字列 " dances " が含まれているが、配列データベース構成が含まれている必要があるために発生します。

これは私の設定です:

<?php defined('SYSPATH') OR die('No direct access allowed.');

return array
(
'default' => array
(
    'type'       => 'MySQL',
    'connection' => array(
        'hostname'   => 'localhost',
        'database'   => 'chat',
        'username'   => 'root',
        'password'   => 'root',
        'persistent' => FALSE,
    ),
    'table_prefix' => '',
    'charset'      => 'utf8',
    'caching'      => FALSE,
    'profiling'    => TRUE
)
);

多分誰かがこのような問題を抱えていたのですか、それとも私を助けることができましたか?


DB へのクエリはエラーを引き起こします。このような:

Jelly::factory('user', $user->id())

またはこれ:

DB::select('value')->from('storage')->where('name', '=', 'salt')->limit(1)->execute();

またはこれ:

ORM::factory('node')->where('type', '=', 'page-homepage')->find();

なぜこのエラーが発生するのかわかりません。すべてのメソッドが呼び出されていることを確認しましたが、間違いは見つかりませんでした。

instanceクラス Database のwrite メソッドでこの問題を解決しました

public static function instance($name = NULL, array $config = NULL)
{
    if ($name === NULL)
    {
        // Use the default instance name
        $name = Database::$default;
    }

    if ( ! is_array(Database::$instances))
    {
        Database::$instances = array();
    }

    if ( ! isset(Database::$instances[$name]))
    {
        if ($config === NULL)
        {
            // Load the configuration for this database
            $config = Kohana::$config->load('database')->get($name);
        }

        if ( ! isset($config['type']))
        {
            throw new Kohana_Exception('Database type not defined in :name configuration',
                array(':name' => $name));
        }

        // Set the driver class name
        $driver = 'Database_'.ucfirst($config['type']);

        // Create the database connection instance
        new $driver($name, $config);
    }

    return Database::$instances[$name];
}

ご覧のとおり条件を追加します

if ( ! is_array(Database::$instances))
{
    Database::$instances = array();
}

私はこれが好きではありませんが、選択の余地はありません。

4

1 に答える 1

0

compile私の大げさな推測では、コードquotequote_columnの、、、、、またはメソッドをquote_identifier上書きしているように見えるか、単に呼び出すだけでこのエラーが発生するはずです。quote_tableexecuteKohana_Database->execute('dances')

compileメソッドは直接呼び出さないでください。メソッドはから呼び出される内部関数です。execute()

これらの関数はいずれも$db最初のパラメーターとして使用されます。クエリビルダーで手動で設定しようとせずに、構成ファイルで設定されたデータベースを使用するため、何も渡さないでください。

于 2013-02-13T10:11:31.997 に答える