Транзакции PHP PDO?

У меня есть страница регистрации, и в основном мне нужно вставить данные в 4 таблицы. Я новичок в PDO и что-то смущен.

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

Меня смущает то, что мне нужно сначала вставить имя пользователя, адрес электронной почты, пароль и т. д. в мою таблицу users, чтобы я мог получить (не знаю, как) с помощью PDO uid, который MySQL предоставил моему пользователю (автоматически увеличено mysql). Мне нужен пользовательский uid, который MySQL предоставил моему пользователю для других таблиц, поскольку другим таблицам нужен uid, чтобы все было правильно связано друг с другом. Мои таблицы InnoDB, и у меня есть внешние ключи, идущие от users_profiles(user_uid), users_status(user_uid), users_roles(user_uid) к users.user_uid, поэтому все они связаны друг с другом.

Но в то же время я хочу убедиться, что если, например, после вставки данных в таблицу users(чтобы я мог получить uid, который MySQL предоставил пользователю), что если какая-либо из других вставок потерпит неудачу, он удаляет данные, которые были вставлены в таблицу users.

Думаю, будет лучше, если я покажу свой код; Я прокомментировал код и объяснил в коде, что может облегчить понимание.

// Begin our transaction, we need to insert data into 4 tables:
// users, users_status, users_roles, users_profiles
// connect to database
$dbh = sql_con();

// begin transaction
$dbh->beginTransaction();

try {

    // this query inserts data into the `users` table
    $stmt = $dbh->prepare('
                        INSERT INTO `users`
                        (users_status, user_login, user_pass, user_email, user_registered)
                        VALUES
                        (?, ?, ?, ?, NOW())');

    $stmt->bindParam(1, $userstatus,     PDO::PARAM_STR);
    $stmt->bindParam(2, $username,       PDO::PARAM_STR);
    $stmt->bindParam(3, $HashedPassword, PDO::PARAM_STR);
    $stmt->bindParam(4, $email,          PDO::PARAM_STR);
    $stmt->execute();

    // get user_uid from insert for use in other tables below
    $lastInsertID = $dbh->lastInsertId();

    // this query inserts data into the `users_status` table
    $stmt = $dbh->prepare('
                        INSERT INTO `users_status`
                        (user_uid, user_activation_key)
                        VALUES
                        (?, ?)');

    $stmt->bindParam(1, $lastInsertID,     PDO::PARAM_STR);
    $stmt->bindParam(2, $activationkey,    PDO::PARAM_STR);
    $stmt->execute();

    // this query inserts data into the `users_roles` table
    $stmt = $dbh->prepare('
                        INSERT INTO `users_roles`
                        (user_uid, user_role)
                        VALUES
                        (?, ?)');

    $stmt->bindParam(1, $lastInsertID,      PDO::PARAM_STR);
    $stmt->bindParam(2, SUBSCRIBER_ROLE,    PDO::PARAM_STR);
    $stmt->execute();

    // this query inserts data into the `users_profiles` table
    $stmt = $dbh->prepare('
                        INSERT INTO `users_profiles`
                        (user_uid)
                        VALUES
                        (?)');

    $stmt->bindParam(1, $lastInsertID,      PDO::PARAM_STR);
    $stmt->execute();

    // commit transaction
    $dbh->commit();

} // any errors from the above database queries will be catched
catch (PDOException $e) {
    // roll back transaction
    $dbh->rollback();
    // log any errors to file
    ExceptionErrorHandler($e);
    require_once($footer_inc);
    exit;
}

Я новичок в PDO, и, возможно, есть ошибки или проблемы, описанные выше, которые я еще не замечал, потому что я еще не могу тестировать, пока не выясню свою проблему.

1) Мне нужно знать, как я могу сначала вставить данные пользователей в таблицу пользователей, чтобы я мог получить uid, который MySQL дал моему пользователю

2) Затем получить uid, который мне нужен для других таблиц

3) Но в то же время, если запрос по какой-либо причине не выполняется после вставки в таблицу пользователей, данные также удаляются из таблицы пользователей.

ОБНОВЛЕНИЕ:

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

36
задан halfer 10 July 2017 в 21:14
поделиться