stworzyłem stronę z konkursami online, jest oparta o chat, w którym użytkownicy wpisują odpowiedzi. Jeżeli trafią jedną z trzech opcji, użytkownik wygrywa. W takiej sytuacji do tabeli z wiadomościami była dodawania nowa, a później wykonywał się UPDATE w tabeli z konkursami, żeby ustawić zwycięzcę, jeżeli odpowiedź jest prawidłowa. Niestety, ostatnio są problemy - skrypt dwa razy dodał prawidłową odpowiedź do chatu, ale nie ustawił zwycięzcy i wygrała osoba, która podała odpowiedź jako trzecia. Niestety kto inny zajmuje się administracją - nie mogę założyć dodatkowych logów itp.
Zastanawiam się, jak zabezpieczyć skrypt przed taką sytuacją. Korzystam z mysqli, obydwie tabele na silniku InnoDB. Uwarunkowałem dodanie wiadomości do chatu od tego, czy wykonano UPDATE, ale obawiam się, że to za mało. Poniżej fragment pliku odbierającego ajaxowe zapytania:
$update = $db->query( "UPDATE {$DBP_}contests SET `winner`='{$_SESSION['id']}' ". "WHERE `id`='{$contest['id']}' AND winner IS NULL AND '{$message_lowercase}' IN (answer, answer2, answer3)" ); if ($update) { if ($db->affected_rows === 1) 'winner_login' => $_SESSION['username'], 'winner_gravatar' => $_SESSION['gravatar'] ); // ADD MESSAGE $db->query("INSERT INTO {$DBP_}chat SET `user_id`='{$_SESSION['id']}', `date`=NOW(), `text`='{$message}'"); }
Czy ktoś mógłby podać jakąś wskazówkę co jeszcze można zrobić?