PHP PDO交易?

PHP*_*VER 36 php mysqli pdo transactions multi-query

我有一个注册页面,基本上我需要将数据插入到4个表中.我是PDO的新手,对某些事感到困惑.

基本上,如果任何插入失败,我不希望任何添加到数据库的东西,这似乎很简单.

我的困惑是,我需要先在我的users表中插入用户的用户名,电子邮件,密码等,这样我就可以得到(不确定如何)使用PDO的MySQL给我的用户(由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;
}
Run Code Online (Sandbox Code Playgroud)

我是PDO的新手,可能还有上面的错误或问题,我还没有注意到,因为在找出问题之前我还无法测试.

1)我需要知道如何首先在users表中插入用户数据,这样我就可以获得MySQL给用户的uid了

2)然后获取uid,因为我需要它用于其他表

3)但同时如果在插入到用户表之后查询因任何原因失败,那么数据也会从users表中删除.

更新:

我更新了上面的代码,以反映有用的成员提供的更改.

Vla*_*sny 18

此函数返回刚刚插入的记录的主键:PDO :: lastInsertId 您将需要它用于NEED_USERS_UID_FOR_HERE参数.在INSERT语句之后使用它.

由于您启动了事务,如果您的MySQL表使用InnoDB引擎(MyISAM不支持事务),如果发生任何错误,数据将不会插入到任何表中.

  • 是.只需将其存储为变量并在进一步查询中使用它.如果事务失败,它将不会写入数据库. (2认同)