PHP PDO Transactions?

У меня есть страница регистрации, и в основном мне нужны данные, вставленные в 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) Мне нужно знать, как я могу сначала вставить данные пользователей в таблицу users, чтобы я мог получить uid MySQL, предоставив мой пользователь

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

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

ОБНОВИТЬ:

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

Solutions Collecting From Web of "PHP PDO Transactions?"

Эта функция возвращает первичный ключ только что вставленной записи: PDO :: lastInsertId Он понадобится для параметра NEED_USERS_UID_FOR_HERE . Используйте его сразу после инструкции INSERT.

Поскольку вы начали транзакцию, данные не будут вставлены в какую-либо таблицу, если возникнет какая-либо ошибка, если вы используете механизм InnoDB для своих таблиц MySQL (MyISAM не поддерживает транзакции).