我从数据完整性的角度开始研究当前项目,因此我将事务合并到项目中。现在我已准备好上线,我从安全的角度来看它,并希望添加准备好的语句。但是,我不确定如何使用两个事务和准备好的语句。在伪代码中,这就是我现在所拥有的:
$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();
感谢您的帮助。
答案 0 :(得分:0)
您正在使用commit
和rollback
,但您永远不会开始交易。
$mysqli->begin_transaction();
请注意,如果您正在进行相互依赖的修改查询,则只需要事务。事务回滚将撤消在该事务中执行的任何修改。
您可以嵌套交易,但这有点复杂。