Кнопка SUBMIT

$lider

Бывает
Кнопка SUBMIT

Привет всем !
Есть форма, данные отсылаются в базу при нажатии кнопки SUBMIT методом POST. При клике один раз, все красиво, но некоторые товарищи успевают нажать кнопку 2-n раз, и все одинаковые строки заносятся в базу.
Подскажите как добиться посредством скрипта проверки нажатия кнопки, и при попытке повторно нажать, будет выводиться окошко с сообщением что данные отправляются?
Например это организовано на этом сайте.
 

Larson

Новичок
Записывай в базу время поста. А далее проверяй - если, допустим, второй пост произведен менее чем через, примерно, 30 сек после первого, то в базу ничего не пишем.
 

$lider

Бывает
Записывай в базу время поста. А далее проверяй - если, допустим, второй пост произведен менее чем через, примерно, 30 сек после первого, то в базу ничего не пишем.
Зачем мне все это, если есть скрипт в 5 строчек, зачем к базе запросы делать.
 

Larson

Новичок
Ну дабавь еще 5 строк.
А как ты еще узнаешь какой раз юзер нажал сабмит - 5й, 10й ... 100й раз?
 

Ямерт

The Old One
Вот что мне сразу пришло в голову - можно решить это на стороне клиента.
Навесить на onSubmit формы disable=true для этой кнопы. Когда форма сабмитнется первый раз, кнопа сразу станет неактивной, и её никто не нажмёт при всём желании.

У этого решения, правда, есть 2 слабых стороны:

1. Javascript можно отключить.
2. Операции со свойством disabled не поддерживается старыми браузерами.

Вывод: лучше отсеивать пересылку данных 1:1 на сервере (механизм зависит от того, что у тебя там происходит, а мы этого пока не знаем), но этот способ "в лоб" тоже остановит значительный процент "злодеев".
 

Larson

Новичок
И еще одна слабая сторона: я могу сделать свою форму без onSubmit, и тогда придется проверять на сервере REFERER.
 

Ямерт

The Old One
$HTTP_REFERER надо проверять всегда в таких случаях, это само собой разумеется. Если такой проверки нет, то это слабая сторона разработчика, а не приведённого выше client-side решения.
 

Larson

Новичок
Автор оригинала: Ямерт
$HTTP_REFERER надо проверять всегда в таких случаях, это само собой разумеется. Если такой проверки нет, то это слабая сторона разработчика, а не приведённого выше client-side решения.
Это все понятно, только я писал для варианта client-side, учитывая:
Зачем мне все это, если есть скрипт в 5 строчек, зачем к базе запросы делать.
Я так понимаю, что в эти пять строчек проверка реферера не входит.
 

Crazy

Developer
Стандартный прекрасно действующий алгоритм -- "мандатная обработка".

1. Когда приходит запрос на отрисовку формы, для оной формы генерится рандомный мандат (к примеру -- 20-значное число). Оный мандат сохраняется на стороне сервера (обычно в БД). В форме мандат добавляется как hidden-поле.

2. Когда с клиента приходит POST проверяем мандат. Если он на сервере зарегистрирован -- обрабатываем POST и удаляем мандат. Если мандат незарегистрирован -- выводим сообщение "Повторный постинг".

Вероятность случайного повторного постинга сводится к нулю. Неслучайного -- к до смешного малым цифрам.
 

$lider

Бывает
$HTTP_REFERER надо проверять всегда в таких случаях, это само собой разумеется. Если такой проверки нет, то это слабая сторона разработчика, а не приведённого выше client-side решения.
Можно конкретнее о $HTTP_REFERER (формат, способы)
 

Макс

Старожил PHPClub
$HTTP_REFERER надо проверять всегда в таких случаях, это само собой разумеется. Если такой проверки нет, то это слабая сторона разработчика, а не приведённого выше client-side решения.
А смысл?
Все равно его (HTTP_REFERER) любой веб-программер подделает.

ИМХО нужно:
1. Запрещать постить информацию с одного IP чаще 30 (время по вкусу) секунд
2. Перед записью в БД проверять есть ли такая запись в таблице. Тут я предпочитаю просто добавить в таблицу одно поле
hash char(32) not null,
и писать в него md5(implode("",$_POST));
и перед зависью делать SELECT по этому полю
(еще можно его сделать его UNIQUE KEY и обойтись без SELECT-а)
 

$lider

Бывает
Подскажите можно ли средствами html или java добится такого эфекта:
после нажатия на кнопку SUBMIT она становится не активной (утапливается например), и второй раз ее не нажмешь ?
 

Макс

Старожил PHPClub
примерно так
<input name="sbmt" type=submit
onclick='document.formName.sbmt.disabled=1'>
 

Доктор

Новичок
Никто не видел "комикс" "чего хотел пользователь" про качели??? Изобрели тут 100-тонный велосипед.

<script language=javascript><!--
form_submitted=false;

function checkForm(f) {
if (form_submitted) return false

form_submitted=true
setTimeout("form_submitted=false",10000)
return true;
}
//-->
</script>


<form action="bla-bla" onSubmit="return checkForm(this)">
 

$lider

Бывает
< INPUT type="submit" onclick="this.disabled=true" value="Ok">

Работает 100% !
То что доктер прописал !
 

$lider

Бывает
Originally posted by Доктор
Никто не видел "комикс" "чего хотел пользователь" про качели??? Изобрели тут 100-тонный велосипед.

А это ваще не понятный скрипт, у меня форма и браузер на него даже ухом не ведут!:( :confused:
 
Сверху