mój problem jest taki, że mam sklep WWW, w momencie składania zamówienia, sprawdza czy istnieje dostępna ilość na stanie, no i tu się pojawia problem, gdyż w momencie liczba_dostepnych<liczba_wybranych pojawia sie komunikat, ale zamiast cały proces zamowienia sie cofnąć to jest przyjmowany ale bez tej pozycji, która objawiła się błędem. a tak być nie powinno. W momencie błędu ilości powinno cofnąć cały proces i tj "nakazać kupującemu zmianę ilości"
-- -- Struktura tabeli dla `koszyk_klienta`-- CREATE TABLE IF NOT EXISTS `koszyk_klienta` ( `id_koszyk` int(11) NOT NULL AUTO_INCREMENT, `id_user` int(11) NOT NULL, `id_sesji` varchar(32) CHARACTER SET latin2 NOT NULL, `id_wyb_rab` int(11) NOT NULL, `ilosc_wyb_rab` int(10) NOT NULL, `data_dodania` date NOT NULL, PRIMARY KEY (`id_koszyk`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=11 ; ---- Struktura tabeli dla `szczegoly_zamowienia`-- CREATE TABLE IF NOT EXISTS `szczegoly_zamowienia` ( `id` int(10) UNSIGNED NOT NULL AUTO_INCREMENT, `id_zam` int(10) UNSIGNED NOT NULL, `id_wyb_rab` int(10) NOT NULL, `ilosc_wyb_rab` int(10) NOT NULL, `cena_wyb_rab` float(6,2) NOT NULL, `suma_wyb_rab` float(6,2) NOT NULL, PRIMARY KEY (`id`), KEY `szczegoly_zamowienia_FKIndex1` (`id_zam`) ) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=5 ; ---- Struktura tabeli dla `zamowienia`-- CREATE TABLE IF NOT EXISTS `zamowienia` ( `id_zam` int(11) NOT NULL AUTO_INCREMENT, `idklienta` int(11) NOT NULL, `rab_suma` float(6,2) NOT NULL, `stan` enum('oczekujace','zrealizowane') NOT NULL, `id_sesji` varchar(32) NOT NULL, `data_zam` datetime NOT NULL, `sposob_zaplaty` varchar(13) NOT NULL, `uwagi` longtext NOT NULL, PRIMARY KEY (`id_zam`) ) ENGINE=InnoDB DEFAULT CHARSET=latin2 AUTO_INCREMENT=4 ;
Więc tak ogólnie w bazie mam kategorie, uslugi, rabat (rabat laczy sie z usluga poprzez iduslugi), klienci, koszyk_klienta, zamowienia, szczegoly_zamowienia... i dwie tabele akurat w tym aspekcie mnie istotne.. Projekt bazy robiony w DBdesigner typ bazy innodb, z uzyciem kluczy obcych..
i teraz tak nie wiem czy do kazdej instrukcji napisanej w kodzie zamowienia.php musze zastosować te commit i rollback ? czy wystarczy jedna ale cofając każde insert update delete ?
<?php require('config.php'); $zamow = "INSERT INTO zamowienia (idklienta,data_zam, sposob_zaplaty,stan,id_sesji,uwagi) VALUES ( '".$_SESSION['user_id']."', '".$data."', '".$_POST["sposob_zaplaty"]."', 'oczekujace', '".$_COOKIE["PHPSESSID"]."', '".$_POST["uwagi"]."')"; if( (!$wynik_zamow)) { } else{ $id_zapytanie="SELECT id_zam FROM zamowienia WHERE id_sesji = '".$_COOKIE["PHPSESSID"]."' AND idklienta = '".$_SESSION['user_id']."' AND data_zam= '".$data."'"; $id_zamow=$temp['id_zam']; $pobierz_koszyk_sql = "select id_koszyk, id_wyb_rab, nazwa_uslugi, cena_z_rabatem, ilosc_wyb_rab from koszyk_klienta Join rabat on rabat.idrabat=koszyk_klienta.id_wyb_rab Join uslugi on rabat.iduslugi=uslugi.iduslugi WHERE id_sesji = '".$_COOKIE["PHPSESSID"]."' OR id_user = '".$_SESSION['user_id']."' "; $idrab = $koszyk_info['id_wyb_rab']; $cena_rab = $koszyk_info['cena_z_rabatem']; $ilosc_rab = $koszyk_info['ilosc_wyb_rab']; $wartosc_zam = $wartosc_zam + $suma; $id_kosz_usun = $koszyk_info['id_koszyk']; $rab_zam = "INSERT INTO szczegoly_zamowienia (id_zam,id_wyb_rab,ilosc_wyb_rab,cena_wyb_rab,suma_wyb_rab) VALUES( '".$id_zamow."', '".$idrab."', '".$ilosc_rab."','".$cena_rab."','".$suma."')"; $usun_koszyk = "DELETE FROM koszyk_klienta WHERE ((id_sesji = '".$_COOKIE["PHPSESSID"]."') OR (id_user = '".$_SESSION['user_id']."')) AND id_koszyk = '".$id_kosz_usun."' "; $update_artykuly = "UPDATE rabat SET ilosc_dostepnych=(ilosc_dostepnych - '".$ilosc_rab."') WHERE idrabat='".$idrab."'"; $ilosc_art_mag ="SELECT ilosc_dostepnych from rabat WHERE idrabat='".$idrab."'"; if( (!$wynik_ilosc)) { } else { $ilosc_mag = $ilosc_magazyn['ilosc_dostepnych']; if ($ilosc_mag>=$ilosc_rab) { // mysql_close($lacze); } else { exit; } } } $wartosc_zam="SELECT SUM(suma_wyb_rab) as suma FROM szczegoly_zamowienia WHERE id_zam='".$id_zamow."'"; $suma_rab = $wartosc_zamowienia['suma']; // echo $suma_rab; $update_wartosc="UPDATE zamowienia SET rab_suma='".$suma_rab."' WHERE id_zam='".$id_zamow."'"; // mysql_close($lacze); include("mail.php"); } } else { require('config.php'); echo " <h2> W momencie potwierdzenia zamówienia, zostaje ono przyjęte do realizacji.</h2><br> <p> W tym miejscu możesz wybrać sposób zapłaty lub wpisać dodatkowe uwagi. </p> <form method=\"post\" action=\"index.php?id&potw\"> <fieldset> <legend align=\"center\">Dane dodatkowe</legend> <table border=\"0\" align=\"center\"> <tr><td><strong>Sposób zapłaty:</strong></td><td> <select name='sposob_zaplaty'> <option value='na miejscu'>na miejscu</option> <option value='przelew'>przelew</option> </select> <br /></td></tr> <tr><td><TEXTAREA NAME=\"uwagi\" ROWS=\"3\" COLS=\"25\">Wpisz dodatkowe uwagi</TEXTAREA></td></tr> </table> <br /> <br /> <input type=\"hidden\" name=\"wartosc\" value=$wartosc_zam> <p class='submit2'> <input type=\"submit\" value=\"Potwierdź zamówienie\" /> </p> </fieldset> </form>"; } } else { echo " <br /><center><span class=blad>Tylko zalogowani użytkownicy mogą dokonać zamówienia <br> wybranych rabatów na usługi. </span><br /><br />"; echo "Jeśli masz już u Nas konto zaloguj się w lewej części, wypełniając pola login i hasło podane przy rejestracji. <br /> <br><br>"; echo "Jeśli jesteś u Nas pierszy raz i nie masz jeszcze konta przejdź do rejestracji. <a href=\"index.php?id&rejestracja\">REJESTRACJA</a><br /> </center>"; } ?>