Здравствуйте! Зарегился на этом форуме, потому что нуждаюсь в помощи опытных людей.
Есть такая проблема.
Допустим, существует форма, в которой есть кнопка, нажимая которую происходит кое-какое действие (списывание очков с игрового счёта пользователя).
Но я не могу придумать решение, как исключить двойное срабатывание скрипта, если пользователь сделал двойной клик по кнопке (или даже несколько раз быстро щелкнул по ней). В итоге получается, что очки со счёта списываются в двойном размере, в тройном и т.п.
Как сделать защиту от этого?
Я пробовал в начале скрипта сделать обращение к Mysql и оттуда бралась дата-время когда последнее списывание происходило, если это значение меньше 10 секунд, то скрипт не должен позволять производить списывание. Но всё равно этот метод неэффективен! Быстрый двойной клик всё равно позволяет "обогнать" обращение к Mysql.
Скрипт на Perl, база Mysql.
Заранее благодарю за помощь! Надеюсь найдётся опытный и добрый человек с хорошим советом.
Как исключить повторное действие если был двойной клик? (Perl + Mysql)
<input type=submit onClick='this.style.disabled=true;document.forms[0].submit();'>
Не уверен, пишу навскидку.
Не уверен, пишу навскидку.
Искусство программирования - заставить компьютер делать все то, что вам делать лень.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Для "спасибо" есть кнопка "Спасибо" в виде звездочки внизу под ником автора поста.
Эту маленькую защиту можно обойти, отключив, пусть даже в Опере, заблокированные кнопки (javascript). Но мне нужна защита получше, на стороне сервера. Всё равно спасибо, что ответили мне.
Дополнение:
Нашёл решение этой задачи путём создания временных файлов:
PERL скрипт
Дополнение:
Нашёл решение этой задачи путём создания временных файлов:
PERL скрипт
Код: Выделить всё
#!/usr/bin/perl
print "Content-Type: text/html\n\n";
$id = 754762; # id пользователя
$filename = $id.'.txt';
if (-e "$filename") { # проверяем, существует ли файл
print "Файл уже существует! / File already exists\n"
}
else {
open(F1, "> $filename") or die $!; # создаём временный файл
print F1 "Какой-угодно текст\n";
close(Fl); # закрываем файл
# ...
# здесь в этом месте вставляем набор операций
# для подключения в базе данных, списыванию
# игровых очков и т.п.
# ...
sleep 1; # задержка в 1 секунду
unlink($filename) || print $!; # удаляем временный файл
print "Готово! / Complete!\n";
}
Подожди когда несколько сотен человек одновременно начнут это делать и радуйся лежащей в лагах машине.., заведи доп. поле в базе и при запросе проверяй время + нужный промежуток и соответственно обновляй время. Проблема повтора у тебя в коде, может ты через транзакции всё делаешь или ещё как-нить криво, что приводит к подобному результату.
[syntax=Delphi] [/syntax]