Transakcje PHP PDO?

Mam stronę rejestracji i w zasadzie potrzebuję danych włożonych do 4 tabel. Jestem nowy w PDO i jestem zdezorientowany.

W zasadzie, jeśli któreś z wstawek zawiedzie, nie chcę niczego dodawać do bazy danych, to wydaje się dość proste.

My confusion is, I need to first insert the 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). Potrzebuję użytkownika UID MySQL dał mój Użytkownik dla Pozostałe tabele, ponieważ inne tabele wymagają identyfikatora uid, więc wszystko jest ze sobą odpowiednio połączone. Moje tabele są InnoDB i mam klucze obce od users_profiles (user_uid), users_status (user_uid), users_roles (user_uid) do użytkowników.user_uid więc wszystkie są ze sobą połączone.

Ale jednocześnie chcę mieć pewność, że jeśli na przykład po włożeniu danych do Tabeli users (dzięki czemu mogę uzyskać uid MySQL podany użytkownikowi), że jeśli którykolwiek z pozostałych wstawek się nie powiedzie, to usunie dane, które zostały wstawiony do Tabeli users.

Myślę, że najlepiej będzie, jeśli pokażę mój kod; skomentowałem kod i wyjaśniłem w kodzie, co może ułatwić zrozumienie.

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

Jestem nowy w PDO i mogą być błędy lub problemy powyżej muszę jeszcze zauważyć, ponieważ nie mogę jeszcze przetestować, dopóki nie rozwiążę mojego problemu.

1) muszę wiedzieć, jak mogę najpierw wstawić dane użytkowników do tabeli users, aby uzyskać uid MySQL dał mojemu użytkownikowi

2) następnie uzyskać uid, jak trzeba it dla innych tabel

3) ale w tym samym czasie, jeśli zapytanie nie powiedzie się z jakiegokolwiek powodu po włożeniu do tabeli users, dane są również usuwane z tabeli users.

UPDATE:

Zaktualizowałem powyższy kod, aby odzwierciedlić zmiany oferowane przez pomocnych członków.

Author: halfer, 2012-04-14

1 answers

Ta funkcja zwraca klucz główny właśnie wstawionego rekordu: PDO:: lastInsertId Będzie ona potrzebna do parametru NEED_USERS_UID_FOR_HERE. Użyj go zaraz po instrukcji INSERT.

Od momentu rozpoczęcia transakcji, dane nie będą wstawiane do żadnej tabeli, jeśli wystąpi jakikolwiek błąd, pod warunkiem, że używasz silnika InnoDB dla tabel MySQL (MyISAM nie obsługuje transakcji).

 18
Author: Vladislav Rastrusny,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-14 18:02:58