Witam!
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 |
...

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):
  1. <?php
  2. //operacja zmiany liczby sztuk produktu po zamówieniu
  3. public function set_stock($item_id, $ammount) {
  4. //pobranie wartości zmiennych
  5. $this->item_id = $item_id;
  6. $this->ammount = $ammount;
  7.  
  8. if($this->ammount<0) {
  9. //bez sensu - nowa wartość, liczba egz. nie może być mniejsza od zera
  10. return false;
  11. }
  12.  
  13. //poszukiwanie produktu o podanym id
  14. $this->db = @mysql_connect(MYQL_HOST, MYSQL_USER, MYSQL_PASSWORD) or die(ERROR_MYSQL_CONNECT);
  15. @mysql_select_db("sklepmetro");
  16. $this->search = @mysql_query("SELECT * FROM `items` WHERE `item_id` = '".$this->item_id."' FOR UPDATE;", $this->db);
  17. $this->result2 = @mysql_num_rows($this->search);
  18. $this->result = @mysql_fetch_array($this->search);
  19.  
  20. if($this->result2==1) {
  21. //znaleziono produkt
  22. if(!@mysql_query("UPDATE `items` SET `on_stock` = '".$this->ammount."' WHERE `item_id` = '".$this->item_id."';", $this->db)) {
  23. //coś nie tak
  24. return false;
  25. @mysql_query("ROLLBACK;", $this->db);
  26. @mysql_close($this->db);
  27.  }
  28. $this->result3 = @mysql_affected_rows();
  29.  
  30. if(!$this->result3) {
  31. //nie dokonano aktualizacji
  32. @mysql_query("ROLLBACK;", $this->db);
  33. @mysql_close($this->db);
  34. return false;
  35.  } else {
  36.  //nie ma takiego produktu
  37.  return false;
  38.  }
  39. }
  40. ?>