2013-03-02 97 views
-1

上下面有我的代碼來連接到數據庫呼叫一個成員函數準備()非對象PHP

function createConnection($DB_USER, $DB_PASSWORD){ 

    $dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD); 

} 

和下方,並且是被稱爲一個函數的代碼

function checkIfUserExists($dbc, $username, $table){ 

    global $dbc; 

    $stmt = $dbc->prepare("SELECT * FROM ? WHERE username = ?"); 
    $stmt = bindParam(1, $table); 
    $stmt = bindParam(2, $username); 
    $stmt->execute(); 

} 

下面是我用它來調用它們的代碼

$connect = new databaseOperations; 
$connect->createConnection($DB_USER, $DB_PASSWORD); 
$connect->checkIfUserExists($dbc, login, Username); 

我的問題是爲什麼會收到調用一個成員函數準備()在非頁面加載時發生對象錯誤?

+0

AIAIAI,在面向對象的代碼... – 2013-03-02 22:14:43

+1

全局我可能是錯的工作,而是一個函數中創建$ DBC,不知道外面這個功能,對嗎? – michi 2013-03-02 22:16:00

+1

除了@ WouterJ的回答之外,請記住PDO僅綁定數據變量。即你可以綁定?到用戶名,但不能綁定表名。如果你有一個變量$表,你應該通過字符串操作將它包含在查詢中。但請務必清理它,如果它來自用戶:http://stackoverflow.com/questions/13405392/pdo-bindparam-issue/13406590#13406590 – 2013-03-02 22:34:32

回答

3

你要明白,因爲你傳遞給checkIfUserExists方法$dbc是不是在全球範圍內可用,僅在創建它的範圍(在這種情況下,createConnection範圍)。

解決方案很簡單:永遠不要在您的代碼中使用全局變量,而您應該使用全局變量的最後一個代碼位於OOP代碼中。

使用這樣的事情:

class DatabaseOperations 
{ 
    private $dbc; 

    public function createConnection(...) 
    { 
     $this->dbc = new PDO(...); 
    } 

    public function checkIfUserExists(...) 
    { 
     $this->dbc->prepare(...); 
     // ... 
    } 
} 

$db = new DatabaseOperations(); 
$db->createConnection(...); 
$db->checkIfUserExists(...); 

還是回到了$dbc variabele在createConnection功能,並傳遞到其他功能。

重要提示:這當然不是你應該使用類的方式。閱讀關於OOP和程序的內容。在這種情況下,通常在User(Active Record)或UserMapper(DataMapper)對象上有一個方法來檢查它是否存在。

+0

+1的完整代碼:( – 2013-03-02 22:25:28

0
function createConnection($DB_USER, $DB_PASSWORD){ 

    $dbc = new PDO('mysql:host=****', $DB_USER, $DB_PASSWORD); 
    return $dbc; // <---- add this... 

} 

function checkIfUserExists($dbc, $username, $table){ 

// ---> no need to use global, because you pass $dbc as an argument 

調用...

$dbc = $connect->createConnection($DB_USER, $DB_PASSWORD); 
+0

請注意,您還需要將返回值保存在一個名爲'$ dbc'的var中 – 2013-03-02 22:26:13

+0

是的,當然,我在我的回答中已經澄清了它。 – michi 2013-03-02 22:27:41

相關問題