2011-02-18 184 views
1

問題出在這裏。我有一個準備好的聲明,像這樣:多個預處理語句的問題

$select_something = $db->stmt_init(); 
$select_something->prepare (" 
SELECT whatever 
FROM table 
"); 
$select_something->execute(); 
$select_something->bind_result($whatever); 

當獨自一人 - 它的工作。當它在執行後添加另一個時,它也可以工作。 但是當我嘗試只是先準備他們兩個:

$select_something = $db->stmt_init(); 
$select_something->prepare (" 
SELECT whatever 
FROM table 
"); 

後來就執行它們:

$select_something->execute(); 
$select_something->bind_result($whatever); 

的第一條語句被執行,而第二個引發此錯誤上面兩條線:

*警告:mysqli_stmt ::執行()[mysqli的-stmt.execute]:無效的對象或資源mysqli_stmt *

注意,語句被命名爲二無論如何($ select_something和$ select_something_else),我只是認爲這是不必要的重複代碼。

謝謝!

+0

請使[代碼示例完整](http://sscce.org/)以及簡潔。 – outis 2011-02-18 09:39:11

回答

1

請注意,mysqli擴展名已被替換爲PDO,它更易於使用且性能更好。你應該使用它而不是mysqli。如果您需要PDO教程,請嘗試「Writing MySQL Scripts with PHP and PDO」。即使您切換,您仍然可能想知道發生了什麼問題,在這種情況下請繼續閱讀。

這個特定的錯誤僅僅意味着你沒有處理mysqli_stmt$select_something$select_something_else。許多擴展中的函數(尤其是DB擴展)在失敗時返回false,而不是資源或對象。這可能是這裏發生的事情。通過測試可能失敗的函數的返回值,遵循正確的錯誤處理過程。使用mysqli::error來獲得MySQLi函數/方法失敗原因的描述。

您可能會遇到mysqli和MySQL驅動程序的限制:必須在結果調用結果之前調用較低級別的mysql_use_result()mysql_store_result()。默認情況下,mysqli_stmt::execute可能會調用mysql_use_result,這意味着舊結果必須是closed before a new query is run(在mysqli::query()的文檔中提到)。正確應用mysqli_stmt::store_result可能會解決此問題。

請注意,您不需要撥打mysqli::stmt_init()(存在mysqli_stmt_init)來支持程序編程。相反,您可以使用mysqli::prepare()