在try-catch中使用mysqli prepared语句处理过程php中的事务
我总是使用mysqli以过程的方式使用PHP。现在我正在处理相互依赖的查询,所以我使用事务(如果query1确定,那么继续query2和commit,如果不回滚)。我总是使用if/else来检查流/错误,但现在我有了更明确的内容,所以我想使用try/catch,因为我不想为了检查每一个查询而必须执行数千次if。在try-catch中使用mysqli prepared语句处理过程php中的事务,php,mysql,transactions,try-catch,prepared-statement,Php,Mysql,Transactions,Try Catch,Prepared Statement,我总是使用mysqli以过程的方式使用PHP。现在我正在处理相互依赖的查询,所以我使用事务(如果query1确定,那么继续query2和commit,如果不回滚)。我总是使用if/else来检查流/错误,但现在我有了更明确的内容,所以我想使用try/catch,因为我不想为了检查每一个查询而必须执行数千次if。 给出以下代码(只是一个示例): 我的问题是: 1-在try/catch中使用程序性mysqli准备语句是否可能(且正确? 2-可以这样继续吗?我的意思是让事务的所有查询和它们的执行都
给出以下代码(只是一个示例):
我的问题是:1-在try/catch中使用程序性mysqli准备语句是否可能(且正确?
2-可以这样继续吗?我的意思是让事务的所有查询和它们的执行都在一次尝试中,这样所有的错误都会被它自己的捕获捕获?
3-是否可以像我在代码中写的那样始终使用相同的变量$stmt,还是每次在继续下一步准备之前都需要使用mysqli_stmt_close($stmt)将其关闭?
4-我写评论的地方:
//如果脚本到达此处,则表示一切正常:
我是对的还是我认为是对的?
我希望一切都很清楚,并能收到几个答案,因为除了代码之外,我不确定继续进行的方式是否正确,我不想做数千次。如果要检查每个查询,我相信有更好的方式。
如果您想在使用try/catch块执行所有数据库事务时给我反馈,请提前向大家表示感谢。如果出现故障,将调用catch,您可以执行回滚。使用
mysqli\u begin\u transaction
,而不是搞自动提交。当使用try/catch块时,所有数据库事务都要提交。如果出现故障,将调用catch,您可以执行回滚。只需使用mysqli\u begin\u transaction
,而不必处理自动提交。
<?php
try {
// disable autocommit
mysqli_autocommit( $db, FALSE );
// lock tables
$query = 'LOCK TABLES `table` WRITE, `other_table` WRITE';
mysqli_query( $db, $query );
// QUERY 1:
$query = 'SELECT `field` FROM `table` WHERE `id` = ?';
$stmt = mysqli_prepare( $db, $query );
if ( $stmt ) {
// bind parameters
mysqli_stmt_bind_param( $stmt, 'i', $_POST[ 'id' ] );
// execute query
mysqli_stmt_execute( $stmt );
// bind result
mysqli_stmt_bind_result( $stmt, $stmt_result );
}
// QUERY 2 INTERDEPENDENT FROM QUERY 1:
$query = 'DELETE FROM `other_table` WHERE `id` = ?';
$stmt = mysqli_prepare( $db, $query );
if ( $stmt ) {
// bind parameters
mysqli_stmt_bind_param( $stmt, 'i', $stmt_result );
// execute query
mysqli_stmt_execute( $stmt );
}
// unlock tables
$query = 'UNLOCK TABLES';
mysqli_query( $db, $query );
///////////////////////////////////////////////////////////////
// //////// IF SCRIPT ARRIVES HERE IT MEANS EVERYTHING IS OK:
///////////////////////////////////////////////////////////////
// Commit
mysqli_commit( $db );
// re-enable autocommit
mysqli_autocommit( $db, TRUE );
}
///////////////////////////////////////////////////////////////
// //////// IF ANYTHING GIVES ERROR/THROW EXCEPTION HANDLE IT:
///////////////////////////////////////////////////////////////
catch ( Exception $e ) {
// rollback
mysqli_rollback( $db );
// re-enable autocommit
mysqli_autocommit( $db, TRUE );
// show error
$_SESSION[ 'alert' ] = "ERROR";
$_SESSION[ 'messaggio' ] = "Error: " . $e->getMessage();
mysqli_close( $db );
header( "Location: output.php" );
exit();
}
?>