Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

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

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

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

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

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

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

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

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

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

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

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

Чтобы пользователь не мог обогнать обращение к бд, нужно вообще блокировать возможность повторного вызова скрипта пока идут процессы "списывания" в 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 в 15:00. Причина: perl
mv28jam вне форума   Ответить с цитированием
Старый 15.01.2010, 17:52   #3
_PROGRAMM_
Профессионал
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Адрес: Российская Федерация
Сообщений: 1,603
Репутация: 239
По умолчанию

Можно попробывать на 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, 20:22   #4
tenos
 
Регистрация: 15.01.2010
Сообщений: 4
Репутация: 10
Хорошо

Цитата:
Сообщение от 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 вне форума   Ответить с цитированием
Ответ

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вакансия: Программист MySQL/ Perl/ Apache (Москва) Ramikzul Работа на постоянной основе - Вакансии 0 29.06.2009 11:47
Двойной клик Алежа Общие вопросы .NET 3 17.11.2008 00:20


21:10.


Powered by vBulletin® Version 3.8.8 Beta 2
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd.

RusProfile.ru


Справочник российских юридических лиц и организаций.
Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru