Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在try-catch中使用mysqli prepared语句处理过程php中的事务_Php_Mysql_Transactions_Try Catch_Prepared Statement - Fatal编程技术网

在try-catch中使用mysqli prepared语句处理过程php中的事务

在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-可以这样继续吗?我的意思是让事务的所有查询和它们的执行都

我总是使用mysqli以过程的方式使用PHP。现在我正在处理相互依赖的查询,所以我使用事务(如果query1确定,那么继续query2和commit,如果不回滚)。我总是使用if/else来检查流/错误,但现在我有了更明确的内容,所以我想使用try/catch,因为我不想为了检查每一个查询而必须执行数千次if。
给出以下代码(只是一个示例):


我的问题是:
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();
}

?>