php i mysql, nielogiczny błąd??

0
$query = mysql_query("select * from users where user = ".$id); 
$dane = mysql_fetch_array($query); 

if(isset($_GET['x']) && $dane['kasa'] > 0) { 
$query = mysql_query("update users set kasa = kasa - 1 where user = ".$id); 
}  

jak to możliwe że pole kasa wskakuje mi na wartość -1 gdy przez jakiś czas przytrzymam f5 ?

0

Obejmij te dwa zapytania transakcją, powinno pomóc.

Kiedy wciskasz F5 wykonujesz skrypt kilka razy, następuje sytuacja:
Wywołanie1: pobiera dane z bazy $dane['kasa'] = 1;
Wywołanie2: pobiera dane z bazy $dane['kasa'] = 1;
Wywołanie1: robi test: 1>0; i wykonuje zapytanie: kasa - 1, czyli 1 - 1 = 0
Wywołanie2: robi test: 1>0; i wykonuje zapytanie: kasa - 1, czyli 0 - 1 = -1

0

a zamiast transakcji można użyć funkcji składowanej i też powinno być ok?

0

Najprościej (ale nie najbardziej elegancko) chyba jest dodać do update "AND kasa > 0"

Edit. Można by nawet sprawdzić ile zapytanie zmodyfikowało wierszy i przy 0 wyrzucić stosowny komunikat.

0

czyli jednym słowem mimo że powinno wykonywać po kolei dla danego usera to istnieje szansa, że coś się spierniczy jak w tym przypadku? i trzema sporo takich zabezpieczeń (np affected_rows) lub transakcji porobić tak?

0

No niestety, takie rzeczy trzeba zabezpieczać - tutaj jeszcze niebezpieczeństwo nie jest tak duże, bo to operacja wykonywana na danym userze,
więc teoretycznie na to konto zalogowana jest jedna osoba, ale wyobraź sobie, że jest to jakiś zasób globalny i w jednym momencie może wykonać taką operację 10 userów.
Wykonujesz jedno zapytanie, pobierasz i porównujesz zmienną, wykonujesz drugie zapytanie - zajmuje to dość dużo czasu, że w tym momencie np. 10 innych osób może kliknąć na to samo i zasób zjedzie np. na -5

0
tauruss napisał(a)

Najprościej (ale nie najbardziej elegancko) chyba jest dodać do update "AND kasa > 0"

Edit. Można by nawet sprawdzić ile zapytanie zmodyfikowało wierszy i przy 0 wyrzucić stosowny komunikat.

A można by było prosić o kod jaki sprawdzić ile zapytanie zmodyfikowało wierszy ? dopiero raczkuję w php i jeszcze nie orientuje się zbytnio jak robić takie zabezpieczenia

0

http://php.net/manual/pl/ref.mysql.php

Pierwsze pozycja od góry

1 użytkowników online, w tym zalogowanych: 0, gości: 1