我正在使用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对象不是全局的?
答案 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'");