Я всегда использовал 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, чтобы проверить каждый запрос, я уверен, что есть лучший способ.
Спасибо всем заранее, если вы хотите дать мне отзыв