2011-08-31 224 views
0

我使用的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

可能。很难说任何背景。 – deceze

+0

这是全球性的,否则你会收到一个未知的变量错误。 这可能不是PDO的一个实例,为什么或如何 - 我无法分辨。 –

+0

你是否在'$ db = new PDO(...)'之后但在$ db-> query'之前重新声明'$ db'? – Mat

回答

2

不这样做的一个好办法,但你应该能够得到它通过增加全球对您的方法/函数的工作:

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

与全局这种方式,你必须非常小心,你不工作在任何时候都不会覆盖变量。

+0

我使用你的方法 –

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); 
+0

哇你的权利我试过var_dump(is_object($ db));在函数中,它表现出错误,但在它表现出的功能之外。有点吸这样的。希望我可以把它全球化。现在生病在你说的功能实例化,直到我找到一个更好的方法。 –

+0

@Sarmen不幸的是,由于Zend引擎的局限性,PHP没有提供声明自己的超全球变量的方法,这一点已经在整个互联网上讨论/哀叹过了。 '$ GLOBALS'是最接近你定制的超全球的(你可以修改'$ _GET','$ _POST'等,但这不推荐),但它确实会让你的代码更加混乱。我有时候做的事情(真正的OO程序员现在注意力不集中)是从'$ GLOBALS'的构造函数中将数据提取到一个对象的属性中,所以我不必记得把它作为参数传入。 – DaveRandom

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'"); 
+0

+1关于使用设计模式。然而,AFAIK你不能在PHP中使用'abstract final' - 除非你可以在以后的版本中使用?这会在PHP 5.2中触发解析错误。您不需要将类声明为“abstract”,而需要使用私有的__construct()方法。 – MrWhite

+0

我修复了我的代码。为失误抱歉。 –

+0

恭喜,你刚刚展示了如何实现一个全局变量。 – hakre

相关问题