简体   繁体   English

PHP PDO交易?

[英]PHP PDO Transactions?

I have a signup page and basically I need data inserted into 4 tables. 我有一个注册页面,基本上我需要将数据插入到4个表中。 I'm new to PDO and am confused over something. 我是PDO的新手,对某些事感到困惑。

Basically if any of the inserts fail I don't want anything added to the database, that seems simple enough. 基本上,如果任何插入失败,我不希望任何添加到数据库的东西,这似乎很简单。

My confusion is, I need to first insert the users username, email, password etc in my users table so I can get (not sure how) using PDO the uid MySQL has given my user (auto incremented by mysql). 我的困惑是,我需要首先在我的users表中插入用户用户名,电子邮件,密码等,这样我就可以得到(不确定如何)使用PDO,MySQL给了我的用户(由mysql自动递增)。 I need the user uid MySQL gave my user for the other tables as the other tables needs the uid so everything is linked properly together. 我需要用户uid MySQL为其他表提供了我的用户,因为其他表需要uid所以所有内容都正确链接在一起。 My tables are InnoDB and I have foreign keys going from users_profiles(user_uid), users_status(user_uid), users_roles(user_uid) to the users.user_uid so they are all linked together. 我的表是InnoDB,我有外键从users_profiles(user_uid),users_status(user_uid),users_roles(user_uid)到users.user_uid,所以它们都链接在一起。

But at the same time I want to ensure that if for example after data is inserted in the users table (so I can get the uid MySQL gave user) that if any of the other inserts fail that it removes the data that was inserted into the users table. 但同时我想确保如果例如在users表中插入数据之后(因此我可以获得MySQL给用户的uid),如果任何其他插入失败,它将删除插入到其中的数据users表。

I thinks it's best I show my code; 我认为我展示我的代码是最好的; I have commented out the code and have explained in the code which may make it easier to understand. 我已经注释掉了代码,并在代码中进行了解释,这可能使它更容易理解。

// 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;
}

I'm new to PDO and there maybe errors or problems above I have yet to notice because I can't test yet until I figure out my problem. 我是PDO的新手,可能还有上面的错误或问题,我还没有注意到,因为在找出问题之前我还无法测试。

1) I need to know how I can insert the users data in the users table first so i can get the uid MySQL gave my user 1)我需要知道如何首先在users表中插入用户数据,这样我就可以获得MySQL给用户的uid了

2) Then get the uid as I need it for the other tables 2)然后获取uid,因为我需要它用于其他表

3) But at the same time if a query fails for whatever reason after inserting into users table that the data is also deleted from the users table aswell. 3)但同时如果在插入到用户表之后查询因任何原因失败,那么数据也会从users表中删除。

UPDATE: 更新:

I updated code above to reflect changes that was offered by helpful members. 我更新了上面的代码,以反映有用的成员提供的更改。

This function returns primary key of just inserted record: PDO::lastInsertId You will need it for NEED_USERS_UID_FOR_HERE parameter. 此函数返回刚刚插入的记录的主键: PDO :: lastInsertId NEED_USERS_UID_FOR_HERE参数需要它。 Use it just after INSERT statement. 在INSERT语句之后使用它。

Since you started a transaction, data will not be inserted into any table if any error occures provided you use InnoDB engine for your MySQL tables (MyISAM doesn't support transactions). 由于您启动了事务,如果您的MySQL表使用InnoDB引擎(MyISAM不支持事务),如果发生任何错误,数据将不会插入到任何表中。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM