39

サインアップページがあり、基本的に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を初めて使用しますが、問題を理解するまでテストできないため、上記のエラーや問題がまだ発生していない可能性があります。

  1. MySQLがユーザーに提供したuidを取得できるように、最初にユーザーデータをusersテーブルに挿入する方法を知る必要があります

  2. 次に、他のテーブルで必要なuidを取得します

  3. ただし、同時に、usersテーブルに挿入した後、何らかの理由でクエリが失敗した場合、データもusersテーブルから削除されます。

4

1 に答える 1

19

この関数は、挿入されたばかりのレコードの主キーを返します。PDO::lastInsertIdパラメーター に必要になりNEED_USERS_UID_FOR_HEREます。INSERTステートメントの直後に使用してください。

トランザクションを開始したため、MySQLテーブルにInnoDBエンジンを使用している場合、エラーが発生してもデータはテーブルに挿入されません(MyISAMはトランザクションをサポートしていません)。

于 2012-04-14T18:02:58.047 に答える