mysql — PHP пробовать / ловить с помощью SQL. Все или ничего

Мне нужно вносить изменения в две базы данных одновременно, но я не хочу, чтобы какая-либо из них проходила в случае неудачи.

Этот блок кода пытается обновить пароль для пользователя в двух отдельных базах данных. Первый запрос идет, затем база данных переключается, затем идет второй запрос. try/catch блок сработает в случае ошибки, однако, если first query is successful и second query is not, first query все еще проходит несмотря на исключение, которое было брошено и поймано. Является try/catch не правильный способ подойти к этому?

Спасибо за любой вклад!

                try {

$new_hash = password_encrypt($new_password);

$query = "UPDATE user SET ";
$query .= "user.hashedPassword = '{$new_hash}' ";
$query .= "WHERE user.userID = '{$user_id}' ";

if(!mysqli_query($connection, $query)) {
throw new Exception('Change Unsuccessful.');
}

if(!mysqli_select_db($connection, 'sub_' . $user['username'] . '_db')) {
throw new Exception('Change Unsuccessful. Switch Error.');
}

$query = "UPDATE user SET ";
$query .= "user.hashedPassword = '{$new_hash}' ";
$query .= "WHERE user.userID = '{$user_id}' ";

if(!mysqli_query($connection, $query)) {
throw new Exception('Change Unsuccessful.');

}

$_SESSION['message'] = 'Password Changed.';
$_SESSION['messageType'] = 'success';

redirect_to("/main.php");

} catch(Exception $e) {
$_SESSION['message'] = $e->getMessage();
$_SESSION['messageType'] = 'danger';
redirect_to("/main.php");
}

1

Решение

Вы можете попробовать добавить

if (!$mysqli->query("query"))
{
printf("Error: %s\n", $mysqli->error);
}

и посмотреть, есть ли ошибка

0

Другие решения

Я знаю, что это старо, но я наткнулся на это сначала через поиск DuckDuckGo. Вот что я думаю, чтобы быть правильным ответом;

Используйте транзакции SQL.

В вашем случае вы должны начать транзакции для обеих баз данных, и если любая из них выдает исключение, откатите их обратно.

В конце концов, транзакция позволяет вам на самом деле попытаться выполнить или отменить команду.

0

По вопросам рекламы [email protected]