如何使用PHP和MySQLi同时使用事务和预处理语句?

时间:2014-04-28 16:28:00

标签: php mysqli transactions prepared-statement

我从数据完整性的角度开始研究当前项目,因此我将事务合并到项目中。现在我已准备好上线,我从安全的角度来看它,并希望添加准备好的语句。但是,我不确定如何使用两个事务和准备好的语句。在伪代码中,这就是我现在所拥有的:

$mysqli = new mysqli(hostname,username,password,database);
$query = " ... ";
$result = $mysqli->query($query);
if($result){
    $mysqli->commit();
}
else{
    $mysqli->rollback();
}

查看有关PHP预处理语句的信息,我将其作为一般格式:

$mysqli = new mysqli(hostname,username,password,database);
if ($mysqli->connect_errno) echo("failed");
$query = "insert into X (var01,var02,var03) values (?,?,?)";
if (!($stmt = $mysqli->prepare($query))) echo("failed");
if (!$stmt->bind_param('sss',$val01,$val02,$val03)) echo("failed");
if (!$stmt->execute()) echo("failed");
$stmt->close();

所以,我的困惑在于我将所准备的语句和事务集成在一起。我不会在commit()之后放置if ($result),而是将其放在$stmt->execute()之后,如此:

$mysqli = new mysqli(hostname,username,password,database);
if ($mysqli->connect_errno) echo("failed");
$query = "insert into X (var01,var02,var03) values (?,?,?)";
if (!($stmt = $mysqli->prepare($query))) echo("failed");
if (!$stmt->bind_param('sss',$val01,$val02,$val03)) echo("failed");
if ($stmt->execute()){
    $mysqli->commit();
}
else{
    $mysqli->rollback();
}
$stmt->close();

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

您正在使用commitrollback,但您永远不会开始交易。

$mysqli->begin_transaction();

请注意,如果您正在进行相互依赖的修改查询,则只需要事务。事务回滚将撤消在该事务中执行的任何修改。

您可以嵌套交易,但这有点复杂。