2012-12-15 61 views
2

顯然,mysqli_stmt::$affected_rows不可用,除非正在使用預準備語句。但是當準備好的報表正在使用時,mysqli::$affected_rowsmysqli_stmt::$affected_rows之間有什麼區別?

我對mysqli::$insert_id vs mysqli_stmt::$insert_id有同樣的問題。

我正在試圖決定是否應該使用另一個。

我已閱讀這些屬性的PHP手冊條目。我已經做了一些測試(PHP 5.3.17)使用單個執行和使用多個執行。我沒有看到區別。

所以我想知道如果在某些情況下(或某些版本)可能有一些差異。如果他們完全一樣,爲什麼都有呢?

回答

2

mysqli_stmt::$affected_rows

返回行的總數量改變,刪除或由 最後執行的語句

mysqli::$affected_rows插入:

獲取受影響的行數在以前的MySQL操作中

因此,如果mysqli_stmt對象是最後執行的語句,則兩個查詢都應該給出相同的結果。

+0

啊,是的。相反,如果mysqli_stmt對象不是最後執行的語句,它們可能會不同。 – toxalot

1

我認爲保留mysqli:$affected_rows的唯一理由是mysqli::querymysqli::multi_query,因爲它們都不使用預處理語句。保持mysqli_stmt:$affected_rows的唯一原因是OOP:將查詢相關信息封裝在語句對象中。

1

我剛剛發現mysqli_stmt::$affected_rowsmysqli::$affected_rows之間的差異,我沒有想到。

我認爲mysqli::$affected_rows可以在關閉語句後調用,因爲我期望它根據在連接上執行的最後一個查詢來報告。如果聲明結束,我不認爲這很重要。不過,它似乎有所作爲。

此代碼:

$db_err_msg = 'Database Error: Failed to update profile'; 
$sql = "UPDATE tblProfiles SET lngPhoneNumber = ? WHERE lngProfileId = ?"; 
$stmt = $mysqli->prepare($sql) or output_error($db_err_msg); 

$phone = 5555555555; 
$id = 10773; 
$stmt->bind_param('ii', $phone, $id) or output_error($db_err_msg); 
$stmt->execute() or output_error($db_err_msg); 

if ($mysqli->warning_count) { 
    $warnings = $mysqli->get_warnings(); 
    do { 
     trigger_error('Database Warning (' . $warnings->errno . '): ' 
      . $warnings->message, E_USER_WARNING); 
    } while ($warnings->next()); 
} 
else { 
    echo 'no warnings', "\n\n"; 
} 

echo 'Before $stmt->close()', "\n"; 
echo '$mysqli->affected_rows is ', $mysqli->affected_rows, "\n"; 
echo '$stmt->affected_rows is ', $stmt->affected_rows, "\n"; 
echo '$mysqli->affected_rows is ', $mysqli->affected_rows, "\n"; 

$stmt->close(); 
echo "\n", 'After $stmt->close()', "\n"; 
echo '$mysqli->affected_rows is ', $mysqli->affected_rows, "\n"; 

產生這樣的輸出:

沒有警告

之前$ stmt-> close()方法
$ mysqli-> affected_rows是1
$ stmt-> affected_rows 1
$ mysqli-> affected_rows爲1

後$ stmt-> close()方法
$ mysqli-> affected_rows是-1

注意的終值是如何負1

mysqli::$affected_rows PHP手冊說:

-1表示查詢換貨政...發現錯誤

查詢按預期更新了記錄,但未返回錯誤或警告。但這意味着有一個錯誤。我不確定這是否是一個錯誤,但它肯定不是我所期望的。無論你使用哪一種,顯然最安全的方法是在執行聲明之後立即檢查它。

相關問題