在尝试捕获中使用mysqli准备的语句在过程php中进行事务处理

时间:2019-02-27 13:21:18

标签: php mysql transactions try-catch prepared-statement

我总是使用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检查每个查询,我敢肯定有更好的方法。
如果您想给我反馈,请提前谢谢大家

0 个答案:

没有答案