这是我用来插入记录的代码。每当有插入错误时,即使我已经回滚,订户表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;}
答案 0 :(得分:6)
在不知道代码中的行号的情况下,很难知道,但是您在第一个try-catch块的末尾提交了您的事务,然后在第二次尝试时没有启动新事务-catch block。
在第二个try-catch块的开头添加$conn->beginTransaction();
。
编辑 - 你提到&#34;我只是想在发生错误时不添加自动增量号&#34;。您不应该依赖自动增量功能来生成无间隙的&#34;数字序列。
答案 1 :(得分:5)
PDO的自动提交可能已启用,并且当您尝试回滚时它会导致问题,因为它已经提交。您可以使用PDO::ATTR_AUTOCOMMIT禁用此行为:
$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);