защита от повтора записи

1. farta007 (28.10.2011 / 20:40)
Такая проблема: юзер вводит в форму число, нажимает кнопку отправить, !ВОТ ПОШЛА ПРОБЛЕМА!, страница еще не загрузилась следующая(редирект), он еще раз и еще раз нажимает на кнопку, и у меня в .dat файле повторные записи...(

Как можно ограничить повторные нажатия на кнопку? и повторные записи?

2. ктулху (28.10.2011 / 20:51)
Изменить флаг открытия. На сколько я понимаю у тебя файл открывается в режиме a+ (дозапись в конец), а нужно w (открытие только для записи, очистка перед записью)

3. farta007 (28.10.2011 / 21:25)
НЕ помогло!!!((((
http://upwap.ru/1799198 вот посмотрите файл от if ($act=="vkredok"){
/////////
$cost=mon($_POST['cost']);
$day="1";
if ($cost>$max || $cost<$min)
может подскажете, 2 дня парюсь и капчи ставил и сесссии и ничего(

4. XoPyC (28.10.2011 / 21:39)
используй unset() с уничтожением числа

5. farta007 (28.10.2011 / 21:43)
можно с примером, я не особо силен

6. XoPyC (28.10.2011 / 21:45)
После добавления записи добавь unset($_SESSION['код']);

7. farta007 (28.10.2011 / 22:40)
никак не могу сообразить, где именно, и какой код =/
это к форме относится или нет?

8. farta007 (31.10.2011 / 01:37)
HELP!!!!

9. KOZZ (31.10.2011 / 02:47)
сессии юзай

Добавлено через 02:10 сек.
создаешь сессию при выводе формы.
Если существуют пост данные,проверяем наличие сессии. Если сессия есть-записываем данные,уничтожаем сессию. Если сессии нет-выводим сообщение об ошибке.

Добавлено через 04:39 сек.
парни,автору надо код написать подробно,напишите по моему алгоритму хотя бы,иначе всем мозг вынесет.

10. Назар (01.11.2011 / 19:50)
а сам написать по своему алгоритму?
form.php
<?php

if(isset($_POST['number_field'])){

  $msg = trim($_POST['number_field']);
  $allow = true;
  if( isset($_SESSION['prev_number']) ){
    if( $_SESSION['prev_number'] == $msg ){
      $allow = false;
    }
  }else{
    $_SESSION['prev_number'] = $msg;
  }

  if($allow){
    /*делаем запись в файл*/
    $_SESSION['prev_number'] = $msg;
  }else{
    echo 'Повтор записи!';
  }
  
}
?>


<form method="post" action="form.php">
<input type="text" name="number_field"/ value=""/>
<input type="submit" value="send"/>
</form>


11. Дмитрий (01.11.2011 / 20:31)
farta007 (31 Октября 2011 / 00:37)
HELP!!!!
В бане. Это не аська.

12. Владимир (01.11.2011 / 20:37)
Писал в личку напишу еще и здесь может кому пригодится.

Либо после запроса юзай:

header('Location: /ссылка');

Тогда после запроса убиваются все данные так как редиректит мгновенно на другую страницу даже если на туже. Но если жать часто от повторов не спасти, поэтому второй вариант.

<?
global $errors_list;

  $errors_list=array(
  'faster'=>'Ваш запрос был заблокирован в связи с ускоренной отправкой данных! Вернитесь назад и                              повторите попытку...'
  );

  function protect_fatal_error($type){
   global $errors_list;

   if($type==11){
   $type='faster';
   } 

   print $errors_list[$type];
   header('Location: /ссылка');
  }

  function protect_error($type){

	if($type){
	$temp=mysql_query("SELECT * FROM `warnings_ip` WHERE `ip`='".ип пользователя."' LIMIT 1");

		if(mysql_num_rows($temp)>0){
		$temp=mysql_fetch_array($temp,true);
		$id=$temp['id'];
		$warnings=$temp['warnings'];
		$last_warning=$temp['time'];

		$warnings++;
		$temp=TIME-$last_warning;
		$temp=(int)($temp/60);

		$warnings-=$temp;

			if($warnings<1){
			$warnings=1;
			}

		} else {
		@mysql_query("INSERT INTO `warnings_ip` (`ip`,`warnings`,`time`) VALUES('".ип пользователя."',1,".TIME.")");
		}
	}

protect_fatal_error($type);
}

 	$temp=mysql_query("SELECT * FROM `warnings_ip` WHERE `ip`='".ип пользователя."' LIMIT 1");

		if(mysql_num_rows($temp)>0){
		$temp=mysql_fetch_array($temp,true);
		$temp=$temp['last_post'];

			if(TIME<$temp+1){
			protect_error(11);
			} else {
			@mysql_query("UPDATE `warnings_ip` SET `last_post`=".TIME." WHERE `ip`='".ип пользователя."' LIMIT 1");
			}
		} else {
		@mysql_query("INSERT INTO `warnings_ip` (`ip`,`last_post`) VALUES('".IP."',".TIME.")");
		}

Ну таблицы я думаю сообразите как сделать, но не люблю я этот вариант с скл запросами на мемкеше гораздо быстрее и проще, ну да ладно им пользуются единицы smile

13. Дмитрий (01.11.2011 / 21:02)
12. Sneg, индийский код. С такие кодом только на H2M хоститься, где и остальные с подобным кодом.

Всего-то 2 строки:
1 : проверка последней записи того, кто в данный момент пишет
2 : проверка, если записуемое сообщение не совпадает с последней записью.

Все. На файлах немного сложнее (10 строк). Но не полотенце же......

14. Владимир (01.11.2011 / 21:20)
dima.london (1 Ноября 2011 / 21:02)
12. Sneg, индийский код. С такие кодом только на H2M хоститься, где и остальные с подобным кодом.

Всего-то 2 строки:
1 : проверка последней записи того, кто в данный момент пишет
2 : проверка, если записуемое сообщение не совпадает с последней записью.

Все. На файлах немного сложнее (10 строк). Но не полотенце же......

Помнится ты хвалил код @lex я взял за основу его идею и сократил малех. =)

Но этот код делает немного больше чем обычная проверка сообщения. Забиваешь в ядро и скоростные запросы блокируются на всем сайте в данном случае чаще 1 запроса в секунду делать нельзя. Если в секунду 2 любых запроса то выполняется условие ну я прописал простой редирект. Но можно и блокировать.

15. Димон (01.11.2011 / 23:23)
/**
 * Функция проверки спама
 * by NEx
 *
 * @param
 * $text string - какое-нибудь сообщение
 * $time int - интервал времени, который надо проверять
 * $number int - количество записей в интервал времени за который можно считать сообщение спамом
 * $match int - сколько одинаковых сообщений можно ввести в интервал времени
 * 
 * @return boolean
 */
function is_spam($text, $time = 60, $number = 3, $match = 1) {
	$is_spam = false;
	$ip = $_SERVER['REMOTE_ADDR'];// можно ip2long перевести
	$hash = md5($text);
	$time = time()-$time;
	$SQL = "SELECT `hash` FROM `spam` WHERE `tc` > '".$time."' AND `ip` = '".$ip."' LIMIT ".$number;
	$res = mysql_query($SQL);
	if(mysql_num_rows($res)>=$number)
		$is_spam = true;
	else {
		while($row = mysql_fetch_assoc($res)) {
			$number--;
			if($row['hash'] == $hash)
				$match--;
			if(!$number || !$match)
				$is_spam = true;
		}
	}
	$SQL = "INSERT INTO `spam` SET `tc` = '".time()."', `ip` = '".$ip."', `hash` = '".$hash."'";
	mysql_query($SQL);
	return $is_spam;
}

Нужна табличка spam c полями tc, ip, hash
Для производительности тип мемори, и 3 индекса на 3 поля

Пользоваться можно так:
$msg = $_POST['msg'];
if(is_spam($msg, 30, 3, 1)){ //проверит не вводили ли в течении 30 секунд 3 сообщения или 1 такое же сообщение
//это спам
}
else {
//идем дальше
}

URL: https://visavi.net/topics/26059