2013-02-16 159 views
12

我正在更新我的PHP代碼從MySQL到mysqli,但我似乎無法找到這個問題的答案:做mysqli更新查詢返回結果?如果mysqli更新查詢返回結果?

與MySQL,我可以做

$result = mysql_query("UPDATE `data` SET `field1` = 1 WHERE `key` = '$mykey'); 

和$結果將是真實的,即使查詢不返回任何行。

但現在,在mysqli的代碼,我有這樣的事情(錯誤處理爲清楚起見移除):

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
$result = $stmt->get_result(); 

和$結果是假的。

對於記錄來說,查詢是有效的(忽略任何可能使拼寫轉換爲堆棧溢出的拼寫錯誤),並且field1在數據庫中按預期正確更新。此外,get_result()對於選擇查詢工作正常,所以它不是get_result()不可用的問題。

基本上,我只是想知道,如果這種變化的行爲是預期的,或者如果我應該繼續嘗試找到某個地方的錯誤。

+0

好的...評論似乎已經消失,告訴我檢查文檔,確實聲明get_result「返回結果集或失敗時返回FALSE」。 但是,在提出我的問題之前,我已經閱讀過了,如果文檔是準確的,我想我只是好奇。 $ stmt-> get_result()返回false後,我檢查了$ stmt-> errno(這是0)和$ stmt-> error(這是空白),並且查詢似乎成功執行(因爲數據庫已更新)。那麼這個錯誤發生在哪裏? – Swiftheart 2013-02-16 07:42:49

回答

11

準備語句是用

$stmt->execute(); 

而且execute()成功返回TRUE或FALSE的失敗執行。

因爲UPDATE,DELETEINSERT不會產生任何結果集,所以不需要使用get_result()。如果您需要知道受影響的行的總數,則可以使用mysqli_stmt_affected_rows()函數執行此操作。

因此你的代碼可能看起來像這樣

$stmt = $mysqli->prepare("UPDATE `data` SET `field1` = 1 WHERE `key` = (?)") 
$stmt->bind_param("s", $mykey); 
$stmt->execute(); 
//You can get the number of rows affected by your query 
$nrows = $stmt->affected_rows; 
if (!$nrows) { 
    //Nothing has been updated 
} 
+0

是的......我在上面的示例代碼中有$ stmt-> execute()行,並在我的實際代碼中檢查返回值。它返回true,所以這很好。我只是好奇,是否_ $ stmt-> get_result()_應該返回true。 – Swiftheart 2013-02-16 07:45:05

+0

查看更新的答案。如果您執行UPDATE,DELETE,INSERT查詢,則不需要使用get_result(),因爲它們不會生成任何結果集。 – peterm 2013-02-16 07:46:31

+0

太好了,謝謝。我很懷疑,但我想要一些外部確認。 – Swiftheart 2013-02-16 07:52:21

3

非SELECT查詢沒有「結果集」,所以get_result是沒有意義的他們。如果您想知道修改查詢(UPDATEINSERTDELETE)是否使用$stmt->affected_rows。這將是0或非零取決於查詢是否做了任何事情。