PHP MySQL 事务捕获错误
Posted
技术标签:
【中文标题】PHP MySQL 事务捕获错误【英文标题】:PHP MySQL Transaction catch error 【发布时间】:2017-08-27 12:16:57 【问题描述】:我已经找了两天了,仍然没有找到答案。假设我在 php 中有下面的代码:
$mysqli->begin_transaction();
mysqli_query($mysqli, "DELETE FROM Test WHERE ID=1");
mysqli_query($mysqli, "DELETE FROM TEST WHEREE ID=2"); <-- THIS ONE WILL FAIL BECAUSE OF TYPO
mysqli_query($mysqli, "DELETE FROM Test WHERE ID=3");
if ($mysqli->commit())
//SUCCESS
else
//Failed
$mysqli->rollback();
我无法检查事务中的查询是否全部成功,因为当我执行这些查询时,提交函数总是返回 true。
如何检查事务中的所有查询是否成功?
【问题讨论】:
将提交包含在 try / catch 结构中。 并在 catch 内回滚 你能给我举个例子吗?我应该如何捕获每个查询的唯一错误消息?我是否必须在事务中分别检查每个查询,这可行吗? 【参考方案1】:执行此操作的常用方法:
$mysqli->begin_transaction();
try
mysqli_query($mysqli, "DELETE FROM Test WHERE ID=1");
mysqli_query($mysqli, "DELETE FROM TEST WHEREE ID=2"); <-- THIS ONE WILL FAIL BECAUSE OF TYPO
mysqli_query($mysqli, "DELETE FROM Test WHERE ID=3");
$mysqli->commit();
catch (\Exception $e)
// this will show statement with error
echo $e->getMessage();
$mysqli->rollback();
throw $e;
【讨论】:
我已经尝试过了,但是由于它不会捕获异常,所以它会提交? 这没有意义。$mysqli->commit();
应该立即之前 catch
这样如果任何失败,无论是查询还是提交,我们都会拼命尝试回滚。
是的,你是对的,通常在提交时可能会出现错误,但这是并发查询中非常具体的错误,而不是语法无效的情况【参考方案2】:
您可以使用 mysqli_error 来捕获错误。
$startTrans = 'START TRANSACTION;'; // Starting a mysql transaction
mysqli_query($conn, $startTrans);
$query = 'Insert into students (roll_no,name,class) VALUES (101,"mathew","fourth")';
$result = mysqli_query($conn, $query);
if (mysqli_error($conn))
// Rollback can be done here
mysqli_query($conn, "ROLLBACK;"); // All above queries will get rolled back
die(mysqli_error($conn));
else
mysqli_query($conn, "COMMIT;"); // changes will get saved to database
【讨论】:
以上是关于PHP MySQL 事务捕获错误的主要内容,如果未能解决你的问题,请参考以下文章
未捕获的错误:调用未定义的函数 mysql_escape_string()