我总是使用mysqli以程序方式使用PHP。现在,我正在使用相互依赖的查询,因此我正在使用事务(如果query1正常,则继续进行query2并提交,如果不回滚,则进行提交)。我一直使用if / else来检查流/错误,但是现在我有了更清楚的说明,因此我想使用try / catch,因为我不想做数千个IF检查每个查询。 > 给出以下代码(仅作为示例):
<?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();
}
?>
我的问题是:
1-是否可以(正确)在try / catch中使用程序化mysqli准备的语句?
2-可以那样做吗?我的意思是将所有有关事务及其执行的查询保存在TRY中,以便所有错误均由其自己的CATCH捕获?
3-是否可以像我在代码中一样始终使用相同的变量$ stmt还是在每次进行下一步准备之前都需要使用mysqli_stmt_close($ stmt)将其关闭?
4-我写评论的地方:
//如果脚本到达这里意味着一切正常,
我是对的还是我认为是对的?
我希望一切都清楚,并能收到几个答案,因为除了代码之外,我不确定继续进行的方式是否正确,我肯定不必做数千次IF检查每个查询,我敢肯定有更好的方法。
如果您想给我反馈,请提前谢谢大家