2011-08-31 220 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

相關問題