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 |
#2 · Zasláno: 2. 5. 2017, 22:07:27
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); } ?> |
||
Časová prodleva: 8 let
|
0