繁体   English   中英

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

[英]Fatal error: Call to a member function query() on a non-object in

我正在使用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对象是否可能不是全局的?

这不是一个很好的方法,但是您应该可以通过在您的方法/函数中添加global来使其工作:

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

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

如果您在全局范围(或​​函数/方法以外的任何其他范围)中声明/实例化了$db ,并试图在函数/方法中使用它,则它将不起作用。 阅读此

如果您的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对象,并使用superglobal $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);

我建议使用一种称为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'");

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM