我有一个注册页面,基本上我需要将数据插入 4 个表中。我是 PDO 的新手,对某些事情感到困惑。
基本上,如果任何插入失败,我不希望将任何内容添加到数据库中,这似乎很简单。
我的困惑是,我需要首先在我的users
表中插入用户的用户名、电子邮件、密码等,这样我才能使用 PDO 获得(不知道如何)MySQL 给我的用户的 uid(由 mysql 自动递增)。我需要用户 uid MySQL 为其他表提供了我的用户,因为其他表需要 uid,因此所有内容都正确链接在一起。我的表是 InnoDB,我有从 users_profiles(user_uid)、users_status(user_uid)、users_roles(user_uid) 到 users.user_uid 的外键,所以它们都链接在一起。
但同时我想确保如果例如在users
表中插入数据之后(所以我可以获得 MySQL 给用户的 uid),如果任何其他插入失败,它会删除插入到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 的新手,上面可能有我还没有注意到的错误或问题,因为在我弄清楚我的问题之前我还不能测试。
我需要知道如何首先在用户表中插入用户数据,这样我才能获得 MySQL 给我的用户的 uid
然后获取其他表需要的 uid
但同时,如果在插入用户表后由于某种原因查询失败,则数据也会从用户表中删除。