Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Скриптовые языки программирования > Perl
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 15.01.2010, 12:30   #1
tenos
 
Регистрация: 15.01.2010
Сообщений: 4
Вопрос Как исключить повторное действие если был двойной клик? (Perl + Mysql)

Здравствуйте! Зарегился на этом форуме, потому что нуждаюсь в помощи опытных людей.

Есть такая проблема.

Допустим, существует форма, в которой есть кнопка, нажимая которую происходит кое-какое действие (списывание очков с игрового счёта пользователя).

Но я не могу придумать решение, как исключить двойное срабатывание скрипта, если пользователь сделал двойной клик по кнопке (или даже несколько раз быстро щелкнул по ней). В итоге получается, что очки со счёта списываются в двойном размере, в тройном и т.п.

Как сделать защиту от этого?

Я пробовал в начале скрипта сделать обращение к Mysql и оттуда бралась дата-время когда последнее списывание происходило, если это значение меньше 10 секунд, то скрипт не должен позволять производить списывание. Но всё равно этот метод неэффективен! Быстрый двойной клик всё равно позволяет "обогнать" обращение к Mysql.

Скрипт на Perl, база Mysql.

Заранее благодарю за помощь! Надеюсь, найдётся опытный и добрый человек с хорошим советом.
tenos вне форума Ответить с цитированием
Старый 15.01.2010, 13:46   #2
mv28jam
Старожил
 
Аватар для mv28jam
 
Регистрация: 09.09.2008
Сообщений: 2,714
По умолчанию

Чтобы пользователь не мог обогнать обращение к бд, нужно вообще блокировать возможность повторного вызова скрипта пока идут процессы "списывания" в mysql. Например в начале скрипта который списывает сделать создание фйала "локера" а в конце удаление и проверку на существование блокиратора.
PHP код:
$id=1;//id пользователя
if (file_exists('lock'.$id))die();
else{
  
file_put_contents('lock'.$id'lock file');
  ...
  
unlink('lock'.$id);

Ещё варианты:
-flock;
-запись id в memcache;
-создание демона(самый сложный и быстрый).
---------------------------------------
Не заметил что perl но суть не меняется.
Стрелок-охотник

Последний раз редактировалось mv28jam; 15.01.2010 в 14:00. Причина: perl
mv28jam вне форума Ответить с цитированием
Старый 15.01.2010, 16:52   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Можно попробывать на javascript
Код:
<script language="javascript">
function Form(f)
{
f.submit.disabled = 0;
}
</script>

<body>
<form>
<input type="button" Value="тест" name="submit" onClick="Form(this.form)">
</form>
</body>
Я тут просмотрел он вроде в експлорере не работает. Вы у себя попробуйте. Но этод код обсуждайте в соответствующем подфоруме(если что-то не работает).

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 15.01.2010, 19:22   #4
tenos
 
Регистрация: 15.01.2010
Сообщений: 4
Хорошо

Цитата:
Сообщение от mv28jam Посмотреть сообщение
...
Ещё варианты:
-flock;
...
Спасибо большое! Ваш совет очень помог мне. Я теперь буду использовать временные файлы для защиты от дублированных операций.

PERL скрипт:
PHP код:
#!/usr/bin/perl

print "Content-Type: text/html\n\n";

$id 754762# id пользователя
$filename $id.'.txt';

if (-
"$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";

tenos вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Двойной клик Алежа Общие вопросы .NET 3 16.11.2008 23:20