【问题标题】:RollBack () and beginTransaction() not work in my PHP PDORollBack () 和 beginTransaction() 在我的 PHP PDO 中不起作用
【发布时间】:2018-07-15 08:14:22
【问题描述】:

RollBack ()beginTransaction() 在我的 PHP PDO 中不起作用,我的表类型是 innoDB。在下面的代码中,我的$sql1 是正确的,而我的$sql2 是错误的(我将d 添加到$last_id 只是为了让它出错)。但它仍然执行sql1 意味着回滚没有效果。感谢您的建议。

<?php

include 'connect.php';
// Get multiple input field's value



try {
   // set the PDO error mode to exception
  $conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);


   // Starts our transaction
   $conn->beginTransaction();

   foreach ($_POST['phone'] as $value) {

       $sql1 = "INSERT INTO tbl_contact_info (type)
       VALUES ('$value')";    

       // use exec() because no results are returned
       $conn->exec($sql1);
       $last_id = $conn->lastInsertId();

       $sql2="INSERT INTO tbl_img (img_type)
       VALUES ('$dlast_id')";    

       $conn->exec($sql2);    

   }
   // Commits out queries
   $conn->commit();
   echo "New record created successfully";    

}

catch(PDOException $e)
   {
   // Something borked, undo the queries!!    
   $conn->rollBack();    

   echo $sql . "<br>" . $e->getMessage();
   }

$conn = null;
?>

【问题讨论】:

  • 怎么回事? $dlast_id 不存在,但 PHP 将简单地传入一个空字符串,并且 INSERT INTO tbl_img (img_type) VALUES ('') 是有效的语法。
  • 您可以添加约束,以防止出现空字符串:stackoverflow.com/a/2514339/4875631
  • 感谢您的 cmets。其实我故意加了“d”让它出错并回滚,但它并没有回滚并执行sql2。
  • FrankerZ,现在我才理解您的评论,您能否进一步解释如何为我的上述代码添加约束?

标签: php mysql database pdo


【解决方案1】:

首先(很抱歉,这很明显,但我意识到并不是每个人都清楚)SQL 和 PHP 是不同的语言。 MySQL 服务器不会对 PHP 代码中触发的未定义变量通知做出反应。

其次,通知不是异常,因此它们不能被 try/catch 语句捕获。 (您当然可以编写一个自定义错误处理程序,它会在错误时引发异常,但这里似乎并非如此。)

【讨论】:

  • 谢谢阿尔瓦罗,我对你的回答不太了解,因为我对编程技能有点初学者。但是,我试图使 sql2 错误,但它没有回滚。
  • 关键是该问题与SQL或PDO无关。我建议你看看Exceptions 章节。 PHP 核心是从 2005 年开始的,当时该语言根本没有异常,这意味着许多基本错误(例如 $dlast_id 而不是 $last_id)根本不会抛出异常,因此您无法尝试/捕获它。
  • 再次感谢阿尔瓦罗。现在我知道了。实际上,我的回滚工作正常。那么有没有什么好的方法可以防止这种空插入使用PHP而不接触编辑数据库?
  • @user9547961 这取决于你想要完成什么。我不会浪费精力尝试在运行时检测这样的错字:该功能根本不起作用,一旦您尝试它就会变得明显。只需确保您的开发框配置为显示所有错误。但是您确实需要使用准备好的语句。不仅是安全 101,而且未定义的变量将呈现 null,因此简单的 NOT NULL 列定义将完全避免插入。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-03
  • 2021-12-16
  • 1970-01-01
  • 2013-01-03
  • 2011-02-11
相关资源
最近更新 更多