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

时间:2012-02-23 18:08:16

标签: 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;}

2 个答案:

答案 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);