использовать подготовленный оператор mysqli для транзакции в процедурном php в try catch - PullRequest
0 голосов
/ 27 февраля 2019

Я всегда использовал PHP процедурным способом, используя mysqli.Теперь я работаю со взаимозависимыми запросами, поэтому я использую транзакции (если 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 - возможно (и правильно) использовать процедурные подготовленные mysqli операторы в try / catch?
2- Можно ли так продолжать?Я имею в виду хранить все запросы транзакции и их выполнение в TRY, поэтому все ошибки отлавливаются собственным CATCH?
3 - нормально ли использовать всегда одну и ту же переменную $ stmt, как я написал в коде, илимне нужно каждый раз закрывать его с помощью mysqli_stmt_close ($ stmt), прежде чем приступить к следующей подготовке?
4 - где я написал комментарий:
// ЕСЛИ СЦЕНАРИЙ ПРИХОДИТ ЗДЕСЬ, ЭТО ОЗНАЧАЕТ, ЧТО ВСЕ ОК:
ЯПравильно или я ДУМАЮ, чтобы быть правым?

Я надеюсь, что все ясно и получаю несколько ответов, потому что кроме кода, я не уверен, что правильный путь продолжается, я не хотел быЯ должен сделать тысячи IF, чтобы проверить каждый запрос, я уверен, что есть лучший способ.
Спасибо всем заранее, если вы хотите дать мне отзыв

...