サインアップページがあり、基本的に4つのテーブルにデータを挿入する必要があります。私はPDOに不慣れで、何かについて混乱しています。
基本的に、挿入のいずれかが失敗した場合、データベースに何も追加したくないので、それは十分に単純なようです。
私の混乱は、最初にユーザーのユーザー名、電子メール、パスワードなどをusers
テーブルに挿入して、MySQLがユーザーに与えたuid(mysqlによって自動インクリメント)をPDOを使用して取得できるようにする必要があることです。他のテーブルにはuidが必要なので、すべてが適切にリンクされるため、MySQLが他のテーブルにユーザーに与えたユーザーuidが必要です。私のテーブルはInnoDBであり、users_profiles(user_uid)、users_status(user_uid)、users_roles(user_uid)からusers.user_uidに移動する外部キーがあるため、すべてがリンクされています。
しかし同時に、たとえばデータがテーブルに挿入された後(MySQLがユーザーに提供したuidを取得できるようにするため)、他の挿入のいずれかが失敗した場合、テーブルusers
に挿入されたデータが削除されることを確認したいと思います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を取得できるように、最初にユーザーデータをusersテーブルに挿入する方法を知る必要があります
次に、他のテーブルで必要なuidを取得します
ただし、同時に、usersテーブルに挿入した後、何らかの理由でクエリが失敗した場合、データもusersテーブルから削除されます。