2010-08-30 42 views
3

任何人都可以指導我在PHP中使用MySQLi擴展的正確方法嗎?我之前一直使用過程化的MySQL函數,並希望進行更改,但在PHP.net和其他站點上找到的例子太複雜了。似乎有多種方法可以做同樣的事情。我想在下面的方法來使用它:正確使用MySQLi

function checkCredentials($username, $password) 
{ 
    $q = $db->prepare("SELECT id FROM `users` WHERE username=? AND password=? LIMIT 1"); 
    $q->bind_param('ss', $username, $password); 
    $q->execute(); 
} 

這是據我已經得到了由PHP.net例子去,但我得到這個錯誤:

Fatal error: Call to a member function prepare() on a non-object in C:\xampp\htdocs\classes\user.class.php on line 14

(該$db變量一個在我的用戶類處理,並且正常工作)

這似乎只是文檔遠的人誰之前的人誰是適度的新類和OOP從未使用entention太複雜了。

有沒有人有鏈接到頁面解釋如何連接/準備語句/執行查詢和一切,或可以把它放在答案?

謝謝。

+2

您可能還想看看使用PDO擴展進行數據庫訪問。它有很多優點。 – Erik 2010-08-30 15:08:21

回答

2

問題是$db不在範圍內(所以它被初始化爲null)。如果你已經使用error_reporting到E_ALL你會看到有關嘗試使用未初始化的變量$db通知......你需要以某種方式把$db到功能範圍:

如果它是一個全球性的varaible:

function checkCredentials($username, $password) { 
    global $db; 

如果它是一個成員變量(這功能是真正的對象的方法):

function checkCredentials($username, $password) { 
    $q = $this->db->prepare(); 

如果是別的東西,你可能需要將其傳遞:

function checkCredentials($username, $password, $db) { 
+0

啊啊。使用'$ this-> db-> prepare()'在我的數據庫句柄通過我的類的構造函數中工作。謝謝 :) – Will 2010-08-30 16:35:22

2

$ db未聲明爲全局。 將global $db的功能:

function checkCredentials($username, $password) 
{ 
    global $db; 
    $q = $db->prepare("SELECT id FROM `users` WHERE username=? AND password=? LIMIT 1"); 
    $q->bind_param('ss', $username, $password); 
    $q->execute(); 
} 

這不是一個很好的OOP風格雖然。

+0

那麼,新的答案然後:) – Lekensteyn 2010-08-30 15:10:51

+0

當然其相關。你不能在你的函數中訪問一個名爲$ db的對象,這就是它導致錯誤的原因。 - > prepare是不會導致錯誤的,事實上$ db不是你函數範圍內的對象就是錯誤。 '調用成員函數prepare()在*非對象*' – Erik 2010-08-30 15:11:23

+0

@Erik:該評論與原始答案(在編輯之前)有關,它表示'$ q'不是一個對象...目前的編輯是正確的(因此我已經刪除了我可能引起混淆的評論)... – ircmaxell 2010-08-30 15:13:14

2

您遇到的錯誤意味着$db不是一個對象。

一種可能性是,你已經初始化$db一個函數調用,但嘗試使用它裏面一個功能 - 在這種情況下,你需要從使用global關鍵字的全局命名空間導入。在PHP中全局變量是不會自動可見的內部功能 - 你必須告訴PHP做一個全局變量可見:

function foo() { 
    global $db; 
    // do stuff with $db 
} 

另一種可能性是,它是FALSE如果你從mysqli_connect()分配給它的價值 - 機會是你的連接信息有一個錯字或類似的東西。

+0

@ircmaxell - 通常OP不會發布完整的內容,所以我提供了兩種可能的解釋。 – Amber 2010-08-30 15:13:48

+0

夠公平的(因此,我刪除了我的評論)...編輯解釋得很好(我原來的評論是在原始編輯中,不再適用)... +1 – ircmaxell 2010-08-30 15:15:00