2010-12-20 141 views
23

我想在這個準備好的聲明一個變量綁定,但我不斷收到錯誤:調用一個成員函數bind_param()一個非對象

Call to a member function bind_param() on a non-object 

的函數被調用,和變量傳遞給它。當我更改函數只是回顯變量,變量打印在頁面上罰款,但如果我嘗試綁定它在這裏我收到錯誤。誰能幫忙?

//CALL FROM PAGE ONE 
check($username); 

//FUNCTION ON PAGE 2 
function check($username){ 
$DBH = getDBH(); 
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); 
$qSelect->bind_param("s", $username); 
} 

我知道函數沒有完全寫在這裏,但這應該不成問題。我不明白爲什麼我收到此錯誤。

+3

'var_dump($ qSelect)'來檢查它是否是你認爲的。 – Mchl 2010-12-20 08:43:41

回答

23

作爲錯誤消息說,$qSelect似乎不是一個對象。嘗試通過使用var_dump($qSelect);在您的準備呼叫之後進行調試。還請檢查getDBH()是否會返回您所需的內容。

聽起來像準備呼叫失敗(不知道爲什麼),所以它返回false - false是不是一個對象,所以你不能呼籲bind_param()就此。

編輯:你沒有給出信息,但它看起來像你使用PHP的PDO。在這種情況下,請看the documentation

If the database server successfully prepares the statement, PDO::prepare() returns a PDOStatement object. If the database server cannot successfully prepare the statement, PDO::prepare() returns FALSE or emits PDOException (depending on error handling).

你應該配置你的服務器返回那些PDO-異常,它會告訴你爲什麼準備調用失敗。

+0

是的,它的qSelect正在返回布爾(假),但這沒有任何意義,因爲我有一個幾乎相同的功能,它工作正常。 – mcbeav 2010-12-20 09:13:21

+0

我正在使用mysqli – mcbeav 2010-12-20 09:13:44

+0

嗯。我也處於具有幾乎相同功能的情況。事實證明,我已經複製並粘貼它,以添加一個字段。但我在新領域之前忘了逗號!愚蠢的錯誤,但它只是表明,它可能只是您輸入的錯誤。 – 2017-01-30 21:41:07

67

好,一個原因準備()可以失敗是 -

if the sql statement sent to it is not valid in the current DB. 

準備(),然後將返回false。

例如 - 如果表名不正確或查詢中的一個或多個字段不存在

+0

完美信息。 – ripa 2014-04-09 05:32:23

+0

謝謝!這幫助了我很多。 :) – dotslash 2014-12-27 17:20:16

17

我正在使用mysqli方法,並且在關閉第一個實例之前創建mysqli的另一個實例時出現了同樣的錯誤。所以在啓動同一段代碼之前使用close()是很重要的。例如:

$DBH = getDBH(); 
$qSelect = $DBH->prepare("SELECT * FROM users WHERE username = ?"); 
$qSelect->bind_param("s", $username); 
$qSelect->close(); // <--- use close before calling the same function(wich contains $DBH code) again; 
+0

如果他多次使用這樣的函數,我認爲他應該使用reset()而不是close(),並且將funcion之外的prepare()移動到構造函數中,像這樣將put語句放入屬性中: $ this-> qSelect。 – qdinar 2016-08-24 19:50:07

2

看起來準備很愚蠢。它不會完全依賴於MySQL的查詢,我的意思是,如果在你的查詢中,你有一個恰好與關鍵字名稱相同的表,比如說「user」,「order」...... ,它只是不會將其識別爲表格,而是將其視爲關鍵字命令實際執行的內容,因此查詢結果變得混亂,準備失敗。

要解決這個問題很簡單,您必須以「正確」的方式在表名兩邊添加「`」來輸入。例如:

`user`, `order`, `...` 

這是正確的,但是,我覺得從準備這種行爲是愚蠢的。

1

檢查數據庫中用戶的權限。沒有「插入」權限的用戶在嘗試插入時也會導致「在非對象上調用成員函數bind_param()」消息錯誤。

1

只用於幫助沒有像我這樣的PHP經驗的人。

在我的情況下,這個錯誤發生,因爲我在SQL sintax中有一個錯誤。控制檯堆棧跟蹤不顯示此問題。

當我修復SQL的過程沒有問題。

相關問題