Mam bazę danych typu InnoDB, w której trzymam listę (katalog) produktów do sprzedania. Gdy klient złoży zamówienie (ten proces działa ok) na określoną liczbę wybranych produktów, to poniższa funkcja aktualizuje liczbę dostępnych egzemplarzy (kolumna 'on_stock') każdego z wybranych produktów. Gdy wykonuję tę operację dla kilku produktów to wszystkie się aktualizują, oprócz pierwszego wybranego przez użytkownika (czyli nie zawsze jest to kwestia 'item_id' = 1, lecz każdego produktu, który jako pierwszy ma zostać zaktualizowany), gdy zamówienie dotyczy tylko pierwszego, sytuacja się powtarza. W omawianej tabeli 'items' są następujące dane ("..." - nazwy kolumn i wiersze nieistotne do zrozumienia problemu):
Kod
| item_id | ... | on_stock |
| 1 | ... | 5 |
| 2 | ... | 3 |
...
| 1 | ... | 5 |
| 2 | ... | 3 |
...
Teraz wywołuję funkcję w której dzieje się coś takiego: Gdy uruchamiam po raz pierwszy w pętli (powtarzanej tyle razy ile jest zamówionych elementów) funkcję set_stock(1, 2) [co powinno ustawić liczbę egzemplarzy pierwszego produktu z '5' na '2'], a w kolejnym wywołaniu pętli już set_stock(2, 1), to dla ID=1 nic się nie zmienia -> jest 5 szt, a dla ID=2 'on_stock' wynosi poprawnie 1 szt. Tak samo jest, gdy kolejność zamawiania produktów jest odwrotna, czyli ID=2 jest aktualizowany jako pierwszy. I to tutaj jest coś nie tak, bo dokładnie sprawdzałem, że przesłane zmienne $item_id i $ammount są prawidłowe - program dotąd działa dobrze):
<?php //operacja zmiany liczby sztuk produktu po zamówieniu public function set_stock($item_id, $ammount) { //pobranie wartości zmiennych $this->item_id = $item_id; $this->ammount = $ammount; if($this->ammount<0) { //bez sensu - nowa wartość, liczba egz. nie może być mniejsza od zera return false; } //poszukiwanie produktu o podanym id $this->search = @mysql_query("SELECT * FROM `items` WHERE `item_id` = '".$this->item_id."' FOR UPDATE;", $this->db); if($this->result2==1) { //znaleziono produkt if(!@mysql_query("UPDATE `items` SET `on_stock` = '".$this->ammount."' WHERE `item_id` = '".$this->item_id."';", $this->db)) { //coś nie tak return false; } if(!$this->result3) { //nie dokonano aktualizacji return false; } else { //nie ma takiego produktu return false; } } ?>