【发布时间】: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,现在我才理解您的评论,您能否进一步解释如何为我的上述代码添加约束?