php - mysqli->commit 总是提交,即使语句中有错误

标签 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()结果的方法是否错误?

非常感谢您的宝贵时间。

最佳答案

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

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

COMMIT 仅当您所做的任何更改实际上无法提交时才会失败 - 因此提交时失败的情况很少见,通常仅在发生灾难性事件(例如数据库服务器崩溃)时才会发生或在您的交易正在进行时重新启动。 (当然,如果您正在运行 Galera Replication Provider,则可能会由于其他原因而发生这种情况,但如果您运行的是,您就会知道这一点。)

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

关于php - mysqli->commit 总是提交,即使语句中有错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42880026/

相关文章:

php - MySQL 本身是否(或者如何)处理并发事务?

php - MySQLi 语句的函数对数据库不执行任何操作

php - 如何分离 PHP 生成的列表项 - Magento

java - 具有多个条件的 Hibernate Join 表,但 @WhereJoinTable 不起作用

php - ajax 返回的数组类型数据不工作 CI

php - 如何在不使用 information_schema 或不知道数据库中任何表的名称的情况下检查数据库是否存在?

php - 如何使用mysql检查带有where子句的撇号

php - Mysqli 最后插入 id 不起作用

php - 想根据我的时区而不是服务器时区获取时间

php - 升级 Laravel 和 PHP 的步骤