即使语句中存在错误,Mysqli-> commit也会一直提交

时间:2017-03-18 21:21:34

标签: php mysql mysqli

我想使用commit()来检查某些查询中是否存在错误。虽然一个语句中存在错误,但它仍在继续工作。

以下是我的代码示例

$mysqli->autocommit(FALSE);
$stmt_a = "INSERT INTO choice(title, question_id) VALUES('choice_A', 2)";
$stmt_b = "INSERT INTO choice(title, question_id) VALUES('choice_B', 2)";
$stmt_c = "INSERT INTO choice(title, question_id) VALUES('choice_C')";

$mysqli->query($stmt_a);    
$mysqli->query($stmt_b);        
$mysqli->query($stmt_c);    

if(!$mysql->commit()){
  echo "MySQL commit failed !";
}else{
  echo "successful!"
}

根据代码,虽然stmt_c缺少question_id值,但提交了stmt_a和stmt_b而忽略了stmt_c 。此外,结果将处于成功的其他条件。

我是否以错误的方式检查commit()的结果?

非常感谢你的时间。

1 个答案:

答案 0 :(得分:0)

如果您想知道查询是否抛出错误,请不要丢弃返回值。 mysqli->query() returns false on error。如果不检查其返回值,就不应该调用它。

COMMIT的目的是将您所做的任何更改提交到数据库中并释放您仍然保留的任何行锁。如果您在事务期间导致错误,则服务器假定您必须已更正问题,并且必须对最终结果感到满意...否则您将不会尝试提交。

COMMIT只会失败,如果您所做的任何更改都无法实际提交 - 因此在提交时失败很少见,通常只有在发生灾难性事件时才会发生,例如数据库服务器崩溃或重新启动您的交易正在进行中。 (当然,如果你正在运行Galera Replication Provider,可能会出现其他原因,但如果你是,你会知道的。)

如果您之前的查询导致错误,或者实际上没有插入/更新/删除任何内容,则不应该提交提交失败...设计。