致命错误:在非对象中调用成员函数query()

时间:2011-08-31 14:53:51

标签: php pdo

我正在使用pdo,我已在配置文件中设置连接字符串,例如

$db = new PDO("mysql:host=localhost;dbname=mydbname", 'root', 'pass');

我在类中的方法/函数

中有这个查询
$query = $db->query("select aUsername,aPassword,aOnline,aLastlogin from tbl_admins where aUsername = '$username'");

当我运行我的网站时,我得到了这个错误。是否有可能$ db对象不是全局的?

3 个答案:

答案 0 :(得分:2)

这不是一个好方法,但你应该能够通过在方法/函数中添加全局来实现它:

function get_user($username) {
    global $db;
    $query = $db->query("select aUsername,aPassword,aOnline,aLastlogin from tbl_admins where aUsername = '$username'");
    ...
}

以这种方式使用全局变量,你需要非常小心,不要在任何时候覆盖变量。

答案 1 :(得分:2)

如果在全局范围(或​​函数/方法以外的任何范围)中声明/ instatiated $db,并尝试在函数/方法中使用它,它将无法工作。 Read this

如果您的PDO对象在方法调用之前无法实例化或未设置,您可能还会收到此错误。请尝试var_dump(is_object($db));和/或var_dump($db);进行检查。

您需要执行以下操作之一:


在方法中实例化PDO对象(可能不实用或最佳选择):

function foo () {
  $db = new PDO( ... );
  ...
  $query = $db->query( ... );   
}

在全局范围内实例化PDO对象,并使用global关键字将其导入方法:

$db = new PDO( ... );

function foo () {
  global $db;
  $query = $db->query( ... );   
}

在全局范围内实例化PDO对象,并使用超全局$GLOBALS数组来访问它。

$db = new PDO( ... );

function foo () {
  $query = $GLOBALS['db']->query( ... );   
}

在全局范围内实例化PDO对象,并将其作为参数传递给方法。

$db = new PDO( ... );

function foo ($db) {
  $query = $db->query( ... );   
}

foo($db);

在全局范围内实例化PDO对象,并将其作为属性传递给对象。

$db = new PDO( ... );

class foo {

  public $db;

  public function bar ($db) {
    $query = $this->db->query( ... );   
  }

}

$foo = new foo;
$foo->db = $db;
$foo->bar($db);

答案 2 :(得分:2)

我建议使用名为Registry的好模式。 PHP中的一个简单实现:

abstract class Registry {

    private static $_tools = array();

    public static function set($name, $value) {
        self::$_tools[$name] = $value;
    }

    public static function get($name) {
        return (isset(self::$_tools[$name]) ? self::$_tools[$name] : null);
    }

}

用法:

$db = new PDO("mysql:host=localhost;dbname=mydbname", 'root', 'pass');
Registry::set('db', $db);

//In some other part of code
$query = Registry::get('db')->query("select aUsername,aPassword,aOnline,aLastlogin from tbl_admins where aUsername = '$username'");