Corby7 / educom-webshop-database

0 stars 0 forks source link

Kan je het aanmaken van een order als 1 atomaire operatie doen, en niet tussendoor de database sluiten #18

Closed JeroenHeemskerk closed 1 year ago

JeroenHeemskerk commented 1 year ago

Onderstaande 2 functies zouden eigenlijk 1 functie moeten zijn https://github.com/Corby7/educom-webshop-database/blob/5af5badc9b29de5991c57f49fc128b6d55060956/mysqlconnect.php#L211-L244

Waarbij je pas na het toevoegen van de order lines de database sluit


Extra: Als je het echt een atomaire operatie wil laten zijn kan je ook eens kijken naar database transacties

Hierbij zet je mysqli_begin_transaction aan het begin en doe je NA ALLE INSERT commando's een mysqli_commit, maar als je tussendoor een Exceptie hebt gehad doe je een mysqli_rollback


     $conn = connectDatabase(); 

     try {
         mysqli_begin_transaction($conn); // <-- Alle SQL verandering hierna zijn nog niet doorgevoerd op de database die andere mensen kunnen zien, ze zijn alleen voor jou zichtbaar.

         $sql = "INSERT INTO orders (user_id, date) VALUES ('$id', '$date')"; 
         /* ... */
         foreach ($cart as $productid => $amount) { 
             $sql = "INSERT INTO orderlines (order_id, product_id, amount) VALUES ('$orderid', '$productid', '$amount')"; 
             /* ... */ 
         }

         if (!mysqli_commit($conn)) { // <-- Commit alle veranderingen sinds 'begin_tranaction'
            throw new Exception(/* ... */);
         }
     } 
     catch (Exception $e) {
         mysqli_rollback($conn); // <-- draai alle veranderingen sinds 'begin_transaction' terug
         throw $e; // <-- rethrow the exception
     } 
     finally {
         mysqli_close($conn);
     }
JeroenHeemskerk commented 1 year ago

Overigens zou de parameter $date altijd de huidige datum moeten zijn en kan je daarvoor ook de MySQL functie "CURRENT_DATE()"

Daarnaast is "date" een gereserveerd woord in MYSQL, dus als je dat gebruikt als kolom naam, zet het dan tussen backticks (``)

INSERT INTO orders (user_id, `date`) VALUES ('$id', CURRENT_DATE())