У меня есть страница регистрации, и в основном мне нужны данные, вставленные в 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, данные также удаляются из таблицы пользователей.
UPDATE:
Я обновил код выше, чтобы отразить изменения, которые были предложены полезными членами.