Apa cara terbaik untuk memasukkan catatan Master/Detail menggunakan PHP-MySQL

Saya memiliki tabel Master Pesanan Penjualan (so_mstr) dan tabel anak Detail Pesanan Penjualan (sod_det). Saya menerima catatan detail dari array $_POST[] dan sedang menyiapkan catatan master di dalam skrip itu sendiri. Skrip saya diharapkan berfungsi seperti berikut.

  1. Masukkan Catatan Utama.
  2. Masukkan Catatan Detail menggunakan PHP for loop (kueri untuk setiap catatan detail.)
  3. Perbarui tabel lain setelah berhasil pada Langkah 1 & 2.

Seluruh proses harus dikembalikan jika salah satu langkah gagal.

Saya telah mencoba kode berikut sejauh ini. Itu terus memasukkan catatan detail bahkan jika permintaan penyisipan master gagal. Adakah yang tahu bagaimana memastikan bahwa semua kueri berjalan dengan sukses atau memutar kembali seluruhnya jika ada yang gagal?

mysqli_autocommit($conn, FALSE);
mysqli_begin_transaction();

$insert_mstr = 'insert into so_mstr(...) values(...)';
mysqli_query($conn, $insert_mstr);

foreach ($order_details['order_details'] as $line_item) {
    $insert_line = 'INSERT INTO sod_det(...) values(...)';
    mysqli_query($conn, $insert_line);
}

if(mysqli_commit($conn)){
    insert_ar_reco(); // inserts into another table
    increment_soseq($conn, $param); // updates a table
}
else{
    echo 'Error occurred! transaction rolled back.';
}

person Aditya Amit    schedule 10.09.2018    source sumber


Jawaban (2)


Anda dapat menggunakan cara di bawah ini untuk menggunakan fungsi rollback dan commit.

mysqli_query($con, "SET AUTOCOMMIT=0");
mysqli_query($con,"START TRANSACTION");
$insertMain = mysqli_query($con,''); // Insert query for Sales Order Master (so_mstr) table
foreach(($order_details['order_details'] as $line_item) {
   $insertChild = mysqli_query($con,''); // Insert query for Sales Order Details (sod_det) table
   if(!$insertChild){
       break;
   }
}

if($insert1 && $insert2) {
    mysqli_query($con,"COMMIT");
} else {
    mysqli_query($con,"ROLLBACK");
}
mysqli_query($con, "SET AUTOCOMMIT=1");

perbarui: jika Anda menggunakan mysqli dengan orientasi objek, Anda dapat melakukan hal berikut:

$mysqli->begin_transaction();
$insertMain = $mysqli->query(''); // Insert query for Sales Order Master (so_mstr) table
foreach(($order_details['order_details'] as $line_item) {
   $insertChild = $mysqli->query(''); // Insert query for Sales Order Details (sod_det) table
   if(!$insertChild){
       break;
   }
}

if($insert1 && $insert2) {
    $mysqli->commit();
} else {
    $mysqli->rollback();
}

PETUNJUK: jika Anda menggunakan versi PHP lama seperti 5.5.0, Anda tidak dapat menggunakan $mysqli->begin_transaction(); dan harus menggunakan $mysqli->autocommit(false); di awal dan $mysqli->autocommit(true); di akhir

person Bhavin Solanki    schedule 10.09.2018
comment
Kelas super! Bekerja seperti pesona! Terima kasih banyak @Bhavin - person Aditya Amit; 10.09.2018

Gunakan "batch insert" bersama dengan "commit" dan "rollback"

person AGK    schedule 10.09.2018