为什么我必须使用PDO启动事务,然后在我从MySQL DB中删除数据之前提交它

时间:2012-11-09 03:46:46

标签: php mysql pdo

当我运行这段代码时

<?php

include '../bin/config.php';
connect();

if (isset($_GET['id']) && is_numeric($_GET['id'])){

    $id = $_GET['id'];
    $stmt = $conn->prepare("DELETE FROM noteline WHERE Nid = ?");
    $stmt->bindParam(1, $id, PDO::PARAM_INT);

    $outcome = $stmt->execute();

    if ($outcome){

        echo 'it was successfully deleted';
        header("Location: ../noteline");
    }else {

        echo 'it was not successful due to something';
    }
}


?>

它回应“它已成功删除”但没有从我的数据库中删除... 但当我通过修改此代码开始一个事务时,这样:

<?php

include '../bin/config.php';
connect();

if (isset($_GET['id']) && is_numeric($_GET['id'])){

    $id = $_GET['id'];
    $stmt = $conn->prepare("DELETE FROM noteline WHERE Nid = ?");
    $stmt->bindParam(1, $id, PDO::PARAM_INT);

    $conn->beginTransaction();
    $outcome = $stmt->execute();

    if ($outcome){

        $conn->commit();
        echo 'it was successfully deleted';
        header("Location: ../noteline");
    }else {

        echo 'it was not successful due to something';
    }
}


?>

我的数据最终从我的MySQL数据库中删除了! 我想知道为什么?

2 个答案:

答案 0 :(得分:2)

因为PDO连接在禁用自动提交模式的情况下运行。查看connect()函数以确保不禁用此模式。

(另外,我看到你正在使用全局变量来存储连接对象。尽可能避免使用全局变量。)

答案 1 :(得分:0)

听起来您的服务器可能已关闭自动提交功能?

http://dev.mysql.com/doc/refman/5.0/en/commit.html

  

默认情况下,MySQL在启用自动提交模式的情况下运行。这意味着   一旦执行更新(修改)表的语句,   MySQL将更新存储在磁盘上以使其永久化。

您的代码中可能有一行发送

SET autocommit=0;

到您的服务器。