Pertanyaan Transaksi PDO PHP?


Saya memiliki halaman pendaftaran dan pada dasarnya saya perlu data dimasukkan ke dalam 4 tabel. Saya baru mengenal PDO dan bingung tentang sesuatu.

Pada dasarnya jika ada insert gagal, saya tidak ingin ada yang ditambahkan ke database, yang tampaknya cukup sederhana.

Kebingungan saya adalah, saya harus memasukkan dulu nama pengguna, email, kata sandi, dll di saya users tabel sehingga saya bisa mendapatkan (tidak yakin bagaimana) menggunakan PDO yang telah diberikan oleh MySQL kepada pengguna saya (otomatis bertambah oleh mysql). Saya perlu pengguna uid MySQL memberi pengguna saya untuk tabel lain karena tabel lainnya membutuhkan uid sehingga semuanya terhubung dengan benar bersama. Tabel saya adalah InnoDB dan saya memiliki kunci asing yang berasal dari users_profiles (user_uid), users_status (user_uid), users_roles (user_uid) ke users.user_uid sehingga semuanya terhubung bersama.

Tetapi pada saat yang sama saya ingin memastikan bahwa jika misalnya setelah data dimasukkan ke dalam users tabel (sehingga saya bisa mendapatkan uid MySQL memberi pengguna) bahwa jika salah satu dari insert lain gagal yang menghilangkan data yang dimasukkan ke dalam users meja.

Saya pikir sebaiknya saya menunjukkan kode saya; Saya telah berkomentar tentang kode dan telah menjelaskan dalam kode yang membuatnya lebih mudah dimengerti.

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

Saya baru mengenal PDO dan mungkin ada kesalahan atau masalah di atas yang belum saya perhatikan karena saya belum bisa menguji sampai saya mengetahui masalah saya.

1) Saya perlu tahu bagaimana saya dapat memasukkan data pengguna di tabel pengguna terlebih dahulu sehingga saya bisa mendapatkan uid MySQL memberi pengguna saya

2) Kemudian dapatkan uid yang saya butuhkan untuk tabel lainnya

3) Tetapi pada saat yang sama jika permintaan gagal karena alasan apa pun setelah memasukkan ke dalam tabel pengguna bahwa data juga dihapus dari tabel pengguna juga.

MEMPERBARUI:

Saya memperbarui kode di atas untuk mencerminkan perubahan yang ditawarkan oleh anggota yang membantu.


32
2018-04-14 17:57


asal


Jawaban:


Fungsi ini mengembalikan kunci utama dari catatan yang disisipkan: PDO :: lastInsertId Anda akan membutuhkannya NEED_USERS_UID_FOR_HERE parameter. Gunakan hanya setelah pernyataan INSERT.

Karena Anda memulai transaksi, data tidak akan dimasukkan ke dalam tabel apa pun jika ada kesalahan yang terjadi asalkan Anda menggunakan mesin InnoDB untuk tabel MySQL Anda (MyISAM tidak mendukung transaksi).


18
2018-04-14 18:02