![](/img/trans.png)
[英]PHP MYSQL PDO is it possible to get rows affected by an update within a transaction?
[英]PHP PDO MySQL Correct way to check if an update query succeeded when no rows are affected
使用php pdo和mysql時,確定更新查詢是否成功的確定方法是什么?
在我的應用程序中,我更新了提交但是用戶的項目總數,表格如下所示:
項目
userId | itemsAdded | itemsChecked | itemsUnChecked | itemsTotal
1 | 5 | 2 | 3 | 5
因此,當我update items set itemTotals = itemsChecked+itemUnChecked
itemsTotal
列保持不變,除非itemsAdded更改且itemsUnChecked增加(2 + 3等於5,1 + 4也是5)。
我曾經使用rowCount()來檢查查詢是否成功,但在這種情況下,由於itemsTotal
列保持不變,因此無法確定sql是否成功。
$query = $conn->prepare($sql);
$query->execute(array(
":itemCount" => $itemCount
":itemId" => $itemId
));
$queryCount = $query->rowCount();
if($queryCount == 1) {
echo 'Updated succeeded';
} else {
echo 'Updated failed!';
}
我也可以用:
$query = $conn->prepare($sql);
$result = $query->execute(array(
":itemCount" => $itemCount
":itemId" => $itemId
));
if($result) {
echo 'Updated succeeded';
} else {
echo 'Updated failed!';
}
但是,如果查詢成功或基於更新的行數,它會返回true還是false?
我只需要檢查查詢是否成功。 無需告知已更新的行數。
當執行SQL語句失敗時, execute()
方法將拋出異常或返回FALSE(取決於您為數據庫連接設置的錯誤模式)。
如果我們在執行語句之前(通常在建立數據庫連接之后立即)將錯誤模式設置為拋出異常,就像這樣
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
然后我們可以使用try / catch塊來處理SQL語句拋出的異常。 像這樣的東西:
try {
$query->execute(...);
echo 'Update succeeded';
} catch(PDOException $e) {
echo 'Update failed!';
echo 'Error: ' . $e->getMessage();
}
有關錯誤模式設置和處理的信息,請參見以下文檔: http : //php.net/manual/en/pdo.error-handling.php
或者,如果PDO未設置為拋出異常,我們可以使用簡單的if
測試。 (如果語句失敗, execute()
方法將返回FALSE。)
if ($query->execute(...)) {
echo 'Update succeeded';
} else {
echo 'Update failed!';
}
為了更精確地控制不同類型的故障,我們可以使用errorCode()
方法來檢索與語句句柄上的最后一個操作相關聯的SQLSTATE,並且我們可以對返回的值執行條件測試。 http://php.net/manual/en/pdostatement.errorcode.php
即使沒有影響行也不意味着更新失敗,就像你說的那樣,沒有任何改變。 如果拋出異常,它只會失敗。 要處理這個問題,您需要實現try / catch塊。
http://php.net/manual/en/language.exceptions.php
try{
$query = $conn->prepare($sql);
$result = $query->execute(array(
":itemCount" => $itemCount
":itemId" => $itemId
));
echo 'Updated succeeded';
} catch(Exception $e) {
echo 'Updated failed!';
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.