带有消息'没有活动事务'的未捕获异常'PDOException'?

use*_*104 4 php mysql pdo

这是我用来插入记录的代码.每当有插入错误时,即使我已经回滚,订户表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)

the*_*iko 6

在不知道代码中的行号的情况下,很难知道但是在第一个try-catch块的末尾提交了事务,然后在第二个try-catch块中没有启动新事务的情况下继续.

$conn->beginTransaction();在第二个try-catch块的开头添加.

编辑 - 您提到"我只想在发生错误时不添加自动增量编号".您不应该依赖自动增量功能来生成"无间隙"数字序列.


FtD*_*Xw6 5

PDO的自动提交可能已启用,并且当您尝试回滚时它会导致问题,因为它已经提交.您可以使用PDO :: ATTR_AUTOCOMMIT来禁用此行为:

$conn->setAttribute(PDO::ATTR_AUTOCOMMIT, FALSE);
Run Code Online (Sandbox Code Playgroud)