Autor Zpráva
tomas2245
Profil
Zdravím, pri zapisovaní objednávok do DB si musím byť na 100% istý že každý INSERT sa podaril a ak nie tak by som potreboval aby to buď vypísalo chybné echo ak čoby len jeden INSERT neprebehol alebo aby sa všetko zrušilo a zopakoval sa INSERT každej tabuľky znova...

skúšam niečo na tento princíp ale neviem či idem dobre nato, prípadne ako by sa to dalo spraviť inak? Vopred ďakujem za rady
$sql_zakaznik = mysqli_query($pripoj,"INSERT INTO objednavky_zakaznik (meno, priezvisko, mesto, ulica, cislodomu, psc, email, telcislo) VALUES ('$meno', '$priezvisko', '$mesto', '$ulica', '$cislodomu', '$psc', '$email', '$telcislo')");

//tovary mám rozdelené do dvoch hlavných kategorií (post_tovar1 a post_tovar2 vidieť dole) 

//a potreboval by som rozlíšiť taktiež keď si zákazník objedná len post_tovar2 tak aby nevadilo že INSERT $sql_post_tovar1 nebol vykonaný a naopak ak si zákazník objedná len post_tovar1 tak nevadí že INSERT $sql_post_tovar2 nebol vykonaný..to myslím že by vyriešilo || ako som uviedol nižšie či sa mýlim?


foreach($post_tovar1 as $kluc_tovar1 => $obsah_tovar1){

$sql_post_tovar1 = mysqli_query($pripoj,"INSERT INTO objednavky_tovar (objednavka_id, druh, pc, pocet) 
VALUES ('$objednavka_id', 'tovar1', '$kluc_tovar1', '$obsah_tovar1')");

}

foreach($post_tovar2 as $kluc_tovar2 => $obsah_tovar2){

$sql_post_tovar2 = mysqli_query($pripoj,"INSERT INTO objednavky_tovar (objednavka_id, druh, pc, pocet) 
VALUES ('$objednavka_id', 'tovar2', '$kluc_tovar2', '$obsah_tovar2')");

}

$result_zakaznik = mysqli_query($pripoj, $sql_zakaznik); 
$result_post_tovar1 = mysqli_query($pripoj, $sql_post_tovar1);    
$result_post_tovar2 = mysqli_query($pripoj, $sql_post_tovar2);
    
$sql_result = $result_zakaznik && $result_objednavkainfo && $result_post_tovar1 || $result_post_tovar2 && $dalsie_resulty; 

if(!$sql_result){
    mysqli_rollback($pripoj);
} else {
    mysqli_commit($pripoj);
}
Keeehi
Profil
tomas2245:
No, tak tohle má k výsledku asi hodně daleko. Začněme třeba tím, že transakci bys měl začít funkcí mysqli_begin_transaction.

Nějaký nástřel by pak mohl vypadat asi takto:
$link = mysqli_connect("127.0.0.1", "my_user", "my_password", "sakila");

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}

mysqli_begin_transaction($link, MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT);

try {
    if (mysqli_query($link, "INSERT INTO objednavky_zakaznik (meno, priezvisko, mesto, ulica, cislodomu, psc, email, telcislo) VALUES ('$meno', '$priezvisko', '$mesto', '$ulica', '$cislodomu', '$psc', '$email', '$telcislo')") === false) {
        throw new Exception();
    }

    foreach($post_tovar1 as $kluc_tovar1 => $obsah_tovar1){
        if(mysqli_query($link, "INSERT INTO objednavky_tovar (objednavka_id, druh, pc, pocet) VALUES ('$objednavka_id', 'tovar1', '$kluc_tovar1', '$obsah_tovar1')") === false) {
            throw new Exception();        
        }
    }

    foreach($post_tovar2 as $kluc_tovar2 => $obsah_tovar2){
        if (mysqli_query($link, "INSERT INTO objednavky_tovar (objednavka_id, druh, pc, pocet) VALUES ('$objednavka_id', 'tovar2', '$kluc_tovar2', '$obsah_tovar2')") === false) {
            throw new Exception();
        }
    }

    mysqli_commit($link);
} catch (Exception $e) {
    mysqli_rollback($link);
}

mysqli_close($link);

S transakcemi jsem nikdy pořádně nedělal, takže je možné, že to bude třeba ještě dost upravit. Ale mělo by to dávat větší smysl, než ten tvůj kód :)
tomas2245
Profil
Keeehi:
ďakujem za odpoveď a návrh, poprosil by som ešte niekoho kto by mi vedel potvrdiť že to takto stačí :)
a ešte by som mal jednu otázočku stačia transakcie tohoto typu alebo musím ešte nejakým iným spôsobom zamykať?
tomas2245
Profil
chcem sa ešte uistiť či zamykám tabuľky s transakciami správne (momentálne to mám v takomto stave):
stačí mi uzamykať len dve hlavné tabuľky odkiaľ potrebujem získať last_insert_id alebo by som mal všetky tabuľky uzamknúť pre WRITE a SELECT pre read?

<?php

mysqli_begin_transaction($pripoj2, MYSQLI_TRANS_START_WITH_CONSISTENT_SNAPSHOT);
 
mysqli_query($pripoj2, "LOCK TABLES objednavky_zakaznik WRITE, objednavky_info WRITE");

try {
    if($zapis_objednavku = mysqli_query($pripoj2, "INSERT INTO objednavky_zakaznik (pismeno, meno, priezvisko, mesto, ulica, cislodomu, psc, email, telcislo) VALUES ('$pismeno', '$meno', '$priezvisko', '$mesto', '$ulica', '$cislodomu', '$psc', '$email', '$telcislo')") === false) {
        throw new Exception();
    }

        $zakaznik_id = mysqli_insert_id($pripoj2);

    if(mysqli_query($pripoj2, "INSERT INTO objednavky_info (zakaznik_id, objednavka_cislo, skupina, mesiac, zaslanie) VALUES ('$zakaznik_id', '$cisloobjednavky', '1', '$mesiac', '$zaslanie')") === false) {
        throw new Exception();
    }

        $objednavka_id = mysqli_insert_id($pripoj2);

    foreach($post_tovar1 as $kluc_tovar1 => $obsah_tovar1){
    
        $nazov_tovar = mysqli_query($pripoj2,"SELECT * FROM produkty WHERE id='$kluc_tovar'");
    $nazov_tovar = mysqli_fetch_array($nazov_tovar);$nazov_tovar = $nazov_tovar['nazov'];  
    
        if(mysqli_query($pripoj2, "INSERT INTO objednavky_tovar (objednavka_id, druh, pc, pocet) VALUES ('$objednavka_id', 'tovar1', '$kluc_tovar1', '$obsah_tovar1')") === false) {
            throw new Exception();        
        }
    }
 
    foreach($post_tovar2 as $kluc_tovar2 => $obsah_tovar2){
  
        $nazov_tovar = mysqli_query($pripoj2,"SELECT * FROM produkty WHERE id='$kluc_tovar'");
    $nazov_tovar = mysqli_fetch_array($nazov_tovar);$nazov_tovar = $nazov_tovar['nazov'];  
    
        if (mysqli_query($pripoj2, "INSERT INTO objednavky_tovar (objednavka_id, druh, pc, pocet) VALUES ('$objednavka_id', 'tovar2', '$kluc_tovar2', '$obsah_tovar2')") === false) {
            throw new Exception();
        }
    }
    
    if(mysqli_query($pripoj2,"INSERT INTO objednavky_faktura (objednavka_id, typ_faktury) VALUES ('$objednavka_id', '$typ_faktury')") === false) {
        throw new Exception();
    }


    mysqli_commit($pripoj2);
    mysqli_query($pripoj2, "UNLOCK TABLES");
    
} catch (Exception $e) {
    mysqli_rollback($pripoj2);
}

?>

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: