这是我用来插入记录的代码.每当有插入错误时,即使我已经回滚,订户表auto-inc号码仍然会增加?问题是什么? 我只是想在发生错误时不添加自动增量编号.非常感谢您的帮助.
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
$conn->beginTransaction();
try {
$email = $_POST['Email'];
$FirstName = $_POST['FirstName'];
$LastName = $_POST['LastName'];
$query="INSERT INTO subscriber (Email,FirstName,LastName,CreateDate) VALUES (?,?,?,CURDATE())";
$stmt = $conn->prepare($query);
$stmt->bindParam(1, $email , PDO::PARAM_STR);
$stmt->bindParam(2, $FirstName, PDO::PARAM_STR);
$stmt->bindParam(3, $LastName, PDO::PARAM_STR);
$stmt->execute();
$conn->commit();
}
catch(PDOException $e)
{
$conn->rollBack();
die ($e->getMessage()."<a href='addSub.php'>Back</a>");
}
$conn->beginTransaction();
try {
$userID = $_SESSION['username'];
$query="INSERT INTO list_sub (SubID,ListID) VALUES ('',$_SESSION[ListID])";
$stmt = $conn->prepare($query);
$stmt->execute();
$conn->commit();
}
catch(PDOException $e)
{
$conn->rollBack();
die ($e->getMessage()."<a href='addSub.php'>Back</a>");
}
$conn = null;}
Run Code Online (Sandbox Code Playgroud)
在不知道代码中的行号的情况下,很难知道但是在第一个try-catch块的末尾提交了事务,然后在第二个try-catch块中没有启动新事务的情况下继续.
$conn->beginTransaction();在第二个try-catch块的开头添加.
编辑 - 您提到"我只想在发生错误时不添加自动增量编号".您不应该依赖自动增量功能来生成"无间隙"数字序列.
PDO的自动提交可能已启用,并且当您尝试回滚时它会导致问题,因为它已经提交.您可以使用PDO :: ATTR_AUTOCOMMIT来禁用此行为:
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
Run Code Online (Sandbox Code Playgroud)