Kohana数据库实例包含错误的数据

时间:2013-02-08 16:10:19

标签: database kohana instance

我对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

这是因为在数据库中:$ 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();

我不知道为什么会发生这种错误。我查了所有方法都被调用了,我没有发现任何错误。

我通过类Database

中的write方法instance解决了这个问题
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();
}

我不喜欢这样,但我没有选择。

1 个答案:

答案 0 :(得分:0)

我的猜测是你似乎覆盖了compilequotequote_columnquote_identifierquote_tableexecute代码中Kohana_Database的方法或只是调用->execute('dances')会触发此错误。

不应直接调用compile方法,它是从execute()

调用的内部函数

这些函数中的任何一个都将$db作为第一个参数。不要传递任何内容,因为您要在配置文件中使用数据库集,而不尝试在查询构建器中手动设置它。