Witam,
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
if (isset($_SESSION['user_id']) and
isset($_SESSION['login'])) { if (isset($_POST["sposob_zaplaty"])) { //zmienna przesylana z formularza do zamowienia $data = date("Y-m-d H:m:s"); 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)) {
echo "<span class='blad'>zamówienie nie zostało zrealizowane. </span>"; echo "<META HTTP-EQUIV=Refresh CONTENT=3;URL=index.php>"; }
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'];
$suma = sprintf("%.02f", $cena_rab * $ilosc_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))
{
echo "<span class='blad'> Wystapił błąd podczas zapisu. </span>"; }
else {
$ilosc_mag = $ilosc_magazyn['ilosc_dostepnych'];
if ($ilosc_mag>=$ilosc_rab) {
// mysql_close($lacze);
}
else {
echo " <span class='blad'> Nie ma takiej ilości rabatów dla usługi: ".$nazwa_uslugi; echo " Zamówienie nie może zostać przyjęte.</span>"; }
}
}
$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."'";
echo('<span class="powodzenie">Zamówienie zostało przyjete do realizacji. </span>'); // mysql_close($lacze);
include("mail.php");
echo "<META HTTP-EQUIV=Refresh CONTENT=5;URL=index.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>";
}
?>