当DELETE未执行时,Pdo事务不会回滚

时间:2016-11-26 13:06:11

标签: php mysql pdo transactions

我正在构建应用程序,应该执行涉及插入,删除和更新命令的多个查询。没有语法错误,但我发现delete命令没有删除条目,但插入命令插入行并且操作没有回滚。如果没有发生删除操作,则应取消插入和其他操作是所需的结果。

<?
try {  
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
    $pdo->beginTransaction();
 $D = 2;
 $Dn = 3;

$dumpi = $pdo->prepare("INSERT INTO `dumpi` .... SELECT .... FROM .... ");
$dumpi->execute();

$matchi = $pdo->prepare("DELETE FROM `marchi` WHERE `id`=....");
$matchi->execute();

$usri = $pdo->prepare("UPDATE `users` SET `status`='0' WHERE `id`='$Dn' ");
$usri->execute();

$donati = $pdo->prepare("UPDATE `dnsn` SET `status`='d' WHERE `id`='$D' ");
$donati->execute();

$donatidel = $pdo->prepare("UPDATE `dnsn` SET `status`='d',`deleted_by`='m' WHERE `dn`='$Dn' AND `status`='1' ");
$donatidel->execute();

 $navwal = $pdo->prepare("UPDATE `wlt` SET `status`='0' WHERE `user`='$Dn'");
$navwal->execute();   

   $navwalt = $pdo->prepare("UPDATE `wlt` SET `status`='0' WHERE `dn`='$Dn' ");
 $navwalt->execute(); 
 // dont let te $D and Dn confuse you, its not the one causing any error

$pdo->commit();

 // echo 'it works';
} catch (PDOException $e) {
$pdo->rollBack();
echo "Failed: " . $e->getMessage();
 }
 ?>

代码在这里结束...... 我与Db的连接是这里的脚本...(仅为参考.php7添加)

$pdoOptions = array(
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => true);
 try {
 $pdo = new PDO(
"mysql:host=" . MYSQL_HOST . ";dbname=" . MYSQL_DATABASE, //DSN
MYSQL_USER, //Username
MYSQL_PASSWORD, //Password
$pdoOptions //Options
);} catch (Exception $e) {
 // design this well to make sense
 die(
// conmment out in launch
$e->getMessage())


);
}

1 个答案:

答案 0 :(得分:0)

好吧,如果查询找不到任何数据,就不是错误。

如果删除查询必须找到要删除的记录对您来说很重要,那么您必须手动验证并抛出异常。

$stmt = $pdo->prepare("DELETE FROM `marchi` WHERE `id`=?");
$stmt->execute([....]);
if (!$stmt->rowCount())
{
    throw new Exception("Delete didn't find a record")
}

然后捕获Exception,而不是PDOException。

请注意,出于某种原因,您不应该使用预备语句