Бан по IP испульзуя PHP + MySQL

Ребят а как вот этим условием что выше удалять именно ту строку в бд где срок уже прошел?

у меня вот такой запрос.

PHP:
$res= $mysqli->query("SELECT * FROM `zakaz_ban`");
$row = $res->fetch_assoc();
if ($row['time'] < time()) {
$res2= $mysqli->query("DELETE FROM `zakaz_ban` WHERE `zakaz_ban`.`id` = '".$row['id']."'");
}

И вообще он правильный?
Если по вешать его на крон будет норм?
 
Правильный, только $row['id'] не надо в одинарные кавычки обрамлять - это же число.
 
Правильный, только $row['id'] не надо в одинарные кавычки обрамлять - это же число.

Понял, а не подскажешь как можно (сравнивать) до пустим у поля с айди 1 прошло ли время. И запускать запрос DELETE именно этому айди 1.

???
 
Сравнивать лучше всего в момент обращения к скрипту, т.е. когда пользователь заходит и авторизуется - то происходит проверка на бан.

А если централизованно, то можно одним запросом сделать

Удаляем все баны у которых прошло время
Код:
$now=time();
$mysqli->query("DELETE FROM `zakaz_ban` WHERE `zakaz_ban`.`time` < $now");
Просто вопрос насколько часто это делать, раз минуту, час и т.д.
 
Сравнивать лучше всего в момент обращения к скрипту, т.е. когда пользователь заходит и авторизуется - то происходит проверка на бан.

А если централизованно, то можно одним запросом сделать

Удаляем все баны у которых прошло время
Код:
$now=time();
$mysqli->query("DELETE FROM `zakaz_ban` WHERE `zakaz_ban`.`time` < $now");
Просто вопрос насколько часто это делать, раз минуту, час и т.д.


Дело в том что этот скрипт бана я использую на странице заказов (страница с формой) и авторизация там не нужна. Когда форма отправляется в бд записывается инфа и конечно же айпи отправлявшего. И в начале файла я инклудю файл с проверкой и выводом надписи забанен а, если нет то не выводить надпись.

Все вроде как и работает правильно. Вот только осталось прикрутить само удаление из бд по окончанию выбрано го срока.

Выбираю срок через селект.
PHP:
echo "<select name='deltime'>";
                    $limit="";
$times=array(1=>"на 1 мин",5=>"на 5 мин",15=>"на 15 мин",30=>"на 30 мин",60=>"на час",1440=>"на день",10080=>"на неделю",43200=>"на месяц",10000000=>"навсегда");
foreach($times as $k=>$v) if(!$limit || $limit>=$k) {$sel=""; if($k==60) $sel="selected"; echo "<option value=$k $sel>$v";}

    echo "</select>";

Записываю дату и время выполнения бана и Get-ом получаю выбранное из селекта и добавляю к дате так:

PHP:
$time = date('Y-m-d H:i', strtotime ('+'.$deltime.' min'));

И в запрос на добавление уходит дата с уже добавленными минутами и в поле с баном в столбец time с типом datetime ложится дата и время в таком порядке 2017-03-28 02:32:00.
 
Последнее редактирование:
Вообщем вопрос решен Minor Огромное спасибо за помощь)
Решил это дело вот таким запросом
PHP:
DELETE FROM `zakaz_ban` WHERE `zakaz_ban`.`time` < NOW()
 
Все вроде как и работает правильно. Вот только осталось прикрутить само удаление из бд по окончанию выбрано го срока.
Влезаю в конец разговора, но всё же...

Зачем удалять данные из базы данных? Данные там - это ценная для Вас информация. В частности, если 1 IP вы отправляете в бан с завидной регулярностью - может не стоит его разбанивать вообще? ))
Грамотнее сделать SELECT с условием, чтобы в него не попадали уже истекшие баны - и не нужно выполнять лишний запрос.

Преимущества:
1) Храним историю
2) Нет периодического запроса "в пустоту" - когда удалять нечего, а запрос всё равно делаем - снижаем нагрузку
3) Снятие бана точно по времени, не дожидаясь выполнения DELETE

Если история вот вообще не нужна - сочетайте эти 2 способа, удаляя "архивные" данные, скажем, раз в сутки.
 
Тогда можно логику изменить, если zakaz_ban`.`time` = 0, то пропускать, и не удалять их, а обнулять.
 
Назад
Сверху