Код IT
← Каталог

Работа с базами данных из PHP — Методы объекта `mysqli`

Фрагмент из «Работа с базами данных из PHP»: Методы объекта `mysqli`.

PHP main.php
<?php
$mysqli = new mysqli("localhost", "user", "password", "database_name");

// Отключение режима автокоммита
$mysqli->autocommit(false);

try {
    // Начало транзакции
    $mysqli->begin_transaction();

    // Первый запрос
    $stmt1 = $mysqli->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
    $amount = 100;
    $from_id = 1;
    $stmt1->bind_param("di", $amount, $from_id);
    $stmt1->execute();
    $stmt1->close();

    // Второй запрос
    $stmt2 = $mysqli->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
    $to_id = 2;
    $stmt2->bind_param("di", $amount, $to_id);
    $stmt2->execute();
    $stmt2->close();

    // Установка точки сохранения
    $mysqli->savepoint("step_2");

    // Симуляция успешного завершения
    // Если бы произошла ошибка, можно было бы вызвать rollback() или rollback to savepoint
    
    // Подтверждение транзакции
    $mysqli->commit();
    echo "Транзакция успешно завершена.\n";

} catch (Exception $e) {
    // Откат транзакции при ошибке
    $mysqli->rollback();
    echo "Транзакция отменена: {$e->getMessage()}\n";
} finally {
    // Возврат режима автокоммита в исходное состояние
    $mysqli->autocommit(true);
    $mysqli->close();
}
?>
<?php
$mysqli = new mysqli("localhost", "user", "password", "database_name");

// Отключение режима автокоммита
$mysqli->autocommit(false);

try {
    // Начало транзакции
    $mysqli->begin_transaction();

    // Первый запрос
    $stmt1 = $mysqli->prepare("UPDATE accounts SET balance = balance - ? WHERE id = ?");
    $amount = 100;
    $from_id = 1;
    $stmt1->bind_param("di", $amount, $from_id);
    $stmt1->execute();
    $stmt1->close();

    // Второй запрос
    $stmt2 = $mysqli->prepare("UPDATE accounts SET balance = balance + ? WHERE id = ?");
    $to_id = 2;
    $stmt2->bind_param("di", $amount, $to_id);
    $stmt2->execute();
    $stmt2->close();

    // Установка точки сохранения
    $mysqli->savepoint("step_2");

    // Симуляция успешного завершения
    // Если бы произошла ошибка, можно было бы вызвать rollback() или rollback to savepoint
    
    // Подтверждение транзакции
    $mysqli->commit();
    echo "Транзакция успешно завершена.\n";

} catch (Exception $e) {
    // Откат транзакции при ошибке
    $mysqli->rollback();
    echo "Транзакция отменена: {$e->getMessage()}\n";
} finally {
    // Возврат режима автокоммита в исходное состояние
    $mysqli->autocommit(true);
    $mysqli->close();
}
?>