Транзакции PHP PDO?
У меня есть страница регистрации, и в основном мне нужны данные, вставленные в 4 таблицы. Я новичок в PDO и меня что-то смущает.
В принципе, если какая-либо из вставок не удалась, я не хочу, чтобы что-либо добавлялось в базу данных, это кажется достаточно простым.
Моя путаница заключается в том, что мне нужно сначала ввести имя пользователя, адрес электронной почты, пароль и т. Д. users
таблицу, так что я могу получить (не знаю, как) с помощью PDO uid, который MySQL дал моему пользователю (автоматически увеличивается на MySQL). Мне нужен пользовательский uid MySQL дал моего пользователя для других таблиц, так как для других таблиц нужен пользовательский идентификатор, чтобы все было правильно связано. Мои таблицы - InnoDB, и у меня есть внешние ключи, идущие от users_profiles (user_uid), users_status (user_uid), users_roles (user_uid) к users.user_uid, поэтому они все связаны друг с другом.
Но в то же время я хочу убедиться, что если, например, после вставки данных в users
таблицу (так что я могу получить пользовательский идентификатор, который 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) Но в то же время, если запрос по какой-либо причине завершается неудачей после вставки в таблицу пользователей, данные также удаляются из таблицы пользователей.
ОБНОВИТЬ:
Я обновил код выше, чтобы отразить изменения, предложенные полезными участниками.
1 ответ
Эта функция возвращает первичный ключ только что вставленной записи: PDO:: lastInsertId Он понадобится вам для NEED_USERS_UID_FOR_HERE
параметр. Используйте его сразу после оператора INSERT.
Поскольку вы запустили транзакцию, данные не будут вставлены ни в одну таблицу, если возникнут какие-либо ошибки, при условии, что вы используете движок InnoDB для своих таблиц MySQL (MyISAM не поддерживает транзакции).