защита от повтора записи
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.")");
}
Ну таблицы я думаю сообразите как сделать, но не люблю я этот вариант с скл запросами на мемкеше гораздо быстрее и проще, ну да ладно им пользуются единицы
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