[英]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.