尝试使用beginTarnsaction()和commit()但是当我将命令放入

时间:2015-07-22 16:42:06

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

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

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

然后插入工作正常。

我已经看过各种exmaples(主要是在这个网站上,但也来自其他各个网站),它们在try catch块之外有$db = new PDO...$db->setAttrib...行(我和#39;尝试了,它没有帮助。)

除此之外,据我所知,我的代码中的所有内容都与其他人的例子排成一行,显然有效。

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

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

如果有人能指出我所犯的错误(或者至少指出我正确的方向),我非常喜欢它,因为我确信它们非常明显而我和我#39;我遗漏了一些非常基本的东西!

提前致谢。

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

1 个答案:

答案 0 :(得分:0)

我发现了一些更多的例子,经过大量的讨论后,我现在得到了一段可行的代码(注意我已经删除了下面代码中的实际插入语句)。

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

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

//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();为什么不起作用,我会为将来的访问者更新此答案)!