php - 尝试使用 beginTransaction() 和 commit() 但当我将命令放入时失败

标签 php mysql pdo

我有点困惑为什么这不起作用,据我所知,我没有做任何与我见过的其他例子不同的事情。

如果我运行以下代码;

try{
    //Set the connection
    $db = new PDO($dbcon, $user, $pass);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //Start Transaction
    $db->beginTransation();

    //SQL to insert Basic Info
    $sql1 = //Insert statement here
    $query1 = $db->prepare($sql1);
    $query1->execute(array(...));

    //Run the SQL commands above
    $db->commit();

    //Set success message
    $return['message'] = 'success';
}
catch(Exception $e) {
    $db->rollback();
    $return['message'] = "Error:  ".$e; 
};


//$return = $_POST;
$return["json"] = json_encode($return);
echo json_encode($return);

然后我的更新失败了。如果我在没有开始/提交行的情况下运行相同的命令;

try{
    //Set the connection
    $db = new PDO($dbcon, $user, $pass);
    $db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    //SQL to insert Basic Info
    $sql1 = //Insert Statement Here
    $query1 = $db->prepare($sql1);
    $query1->execute(...));

    //Set success message
    $return['message'] = 'success';
}
catch(Exception $e) {
    $db->rollback();
    $return['message'] = "Error:  ".$e; 
};


//$return = $_POST;
$return["json"] = json_encode($return);
echo json_encode($return);

然后插入就可以正常工作了。

我见过各种例子(主要在这个网站上,但也来自其他各个网站),其中有 $db = new PDO...$db-> setAttrib... try catch block 之外的行(我已经尝试过,但没有帮助)。

除此之外,据我所知,我的代码中的所有内容都与其他人的示例一致,这显然是有效的。

我对 PDO 非常陌生,这是我第一次尝试使用 beginTransation()commit()

我还应该指出,在我的示例中,我只添加了单个更新,但实际上在 5 个不同的表上有 5 个更新语句,这些语句都依赖于之前的表更新工作。这就是为什么我想使用 begin/commit,因为我相信我可以在 catch 中使用 $db->rollback(); 在发生错误时撤消所有内容(至少是这样)我明白了??)

如果有人能够指出我所犯的错误(或者至少指出我正确的方向),我非常希望,因为我确信它们非常明显,而我错过了一些非常基本的东西!

提前致谢。

编辑 我编辑了上面的代码,删除了一些我认为其他人不需要看到的信息(例如我的数据库连接详细信息以及正在使用的确切插入语句)。

最佳答案

我找到了更多示例,经过一番折腾后,我现在得到了一段可以运行的代码块(请注意,我已经删除了下面代码中的实际插入语句)。

我不知道发生了什么变化,因为我确信我以前尝试过这种布局,但我愿意假设我的代码最初有一个拼写错误,我已经设法在我的代码中纠正了这个错误。各种尝试。

完整的代码布局(如上所述删除了实际语句)是;

//Set the connection
$db = new PDO($dbcon, $user, $pass);
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

try{
    //Start Transaction
    $db->beginTransaction();

    //SQL to insert Basic Info
    $sql1 = //Insert Statement Here
    $query1 = $db->prepare($sql1);
    $query1->execute();    //With parameters

    //Set member_id variable
    $member_id = $db->lastInsertId();

    //SQL to insert Address Info
    $sql2 = //
    $query2 = $db->prepare($sql2);
    $query2->execute();    //With parameters

    //SQL to insert Medical Info
    $sql3 = 
    $query3 = $db->prepare($sql3);
    $query3->execute();    //With parameters

    //SQL to insert Ethnicity and Disability Info
    $sql4 = 
    $query4 = $db->prepare($sql4);
    $query4->execute();    //With parameters

    //SQL to insert Declaration Info
    $sql5 = 
    $query5 = $db->prepare($sql5);
    $query5->execute();    //With parameters

    //Run the SQL commands above
    $db->commit();

    //Set success message
    $return['message'] = 'Database Updated Correctly';

}catch (PDOException $exception){
    $db->rollBack();
    $return['message'] = 'Fail: '.$exception;
};

//$return = $_POST;
$return["json"] = json_encode($return);
echo json_encode($return);

有趣的是,rollBack(); 在此示例中不起作用,但如果我无法弄清楚这一点,那将是另一个问题。 (顺便说一句,如果我确实弄清楚为什么 rollback(); 不起作用,我将为 future 的访问者更新此答案)!

关于php - 尝试使用 beginTransaction() 和 commit() 但当我将命令放入时失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31569141/

相关文章:

mysql,强制主键在两个表中是唯一的

mysql - PHP - MySQL INSERT - 发现一个错误后会取消查询的其余部分吗?

mysql - 学习 PDO 查询

php - PDO 无法访问数据库连接实例

php - 使用 MySQLi 和 PHP 的排名系统(多次检查)

php - 从 openssl_pkey_get_private() 检索原始私钥

php - 保存可由用户重新排列的网页元素

php - 循环内的 persist() 和 flush() - Doctrine

php - 在 php 中使用 mysql 填充函数选项

php - PDO 比较 2 个字段