Как ограничить количество голосов в день по IP в голосовании Php + Mysql?

Привет, у меня есть этот скрипт для голосования, который подсчитывает голоса по IP-адресу. Пожалуйста, как я могу создать сеанс времени на IP-адресах. «Скажите 5 голосов в день за IP-адрес. Избирателю нужно подождать еще 24 часа до голосования снова. Я знаю, что есть такие вопросы, как это. Я пробовал немного, но я просто не могу заставить его работать.

Обновить скрипт;

<?php include("config.php"); $ip=$_SERVER['REMOTE_ADDR']; $add_time = new DateTime(null, new DateTimeZone('Europe/London')); $time=$add_time->format('Ymd H:i:s'); $timeMinus = $add_time = - 60*1*1*1; if($_POST['id']) { $id=$_POST['id']; $id = mysqli_real_escape_String($bd, $id); $ip_sql=mysqli_query($bd, "SELECT ip_add FROM voting_ip WHERE mes_id_fk='$id' AND ip_add='$ip' AND add_time>'$timeMinus'"); $count=mysqli_num_rows($ip_sql); if($count<= 2) { $query = mysqli_query($bd, "UPDATE Messages SET down=down+1 WHERE mes_id=$id"); ( $query); $sql_in = mysqli_query($bd, "INSERT INTO voting_ip (mes_id_fk,ip_add) values ('$id','$ip')"); ( $sql_in); } else { echo "<script>alert('You have already voted, wait for 24 hours and vote again.');</script>"; } $result=mysqli_query($bd, "select down from Messages where mes_id='$id'"); $row=mysqli_fetch_array($result); $down_value=$row['down']; echo $down_value; } ?> 

Solutions Collecting From Web of "Как ограничить количество голосов в день по IP в голосовании Php + Mysql?"

вы можете добавить столбец timestamp в таблицу «vote_ip» и не устанавливать уникальные ключи.

то вы можете сделать запрос, чтобы получить последние 5 записей.

просто вычтите время по последней записи и последней записи

например:

 $times=mysqli_query($bd, "SELECT timestamp FROM voting_ip WHERE mes_id_fk='$id' AND ip_add='$ip' order by timestamp desc limit 5"); if(mysqli_num_rows($ip_sql) < 5 || {first record - last record < 24 hours}) ...your codes... 

Рассмотрим следующее …, в котором я пытаюсь выполнить один и тот же запрос снова и снова, примерно через 2-3 секунды.

 DROP TABLE IF EXISTS my_table; CREATE TABLE my_table (dt DATETIME NOT NULL); SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | +---------------------+ 2 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | +---------------------+ 3 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | +---------------------+ 3 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | +---------------------+ 3 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | | 2016-03-28 22:37:37 | +---------------------+ 4 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | | 2016-03-28 22:37:37 | +---------------------+ 4 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 0 rows affected (0.00 sec) Records: 0 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | | 2016-03-28 22:37:37 | +---------------------+ 4 rows in set (0.00 sec) mysql> INSERT INTO my_table (dt) SELECT DISTINCT NOW() FROM (SELECT 1) a LEFT JOIN my_table b ON NOW() < b.dt + INTERVAL 10 SECOND WHERE b.dt IS NULL; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 mysql> SELECT * FROM my_table; +---------------------+ | dt | +---------------------+ | 2016-03-28 22:35:57 | | 2016-03-28 22:36:06 | | 2016-03-28 22:37:27 | | 2016-03-28 22:37:37 | | 2016-03-28 22:37:47 | +---------------------+ 5 rows in set (0.00 sec) mysql> 

самый простой способ ограничить количество голосов за каждый период времени, чтобы сохранить отметку времени, когда человек голосует в вашей таблице vote_ip … затем в следующий раз, когда они голосуют, подсчитывайте все записи в вашей таблице для голосования с идентификаторами лиц, время которых -stamp больше, чем (текущее время – 24 часа). если счетчик = = 5 голосов .. отобразите сообщение, в котором вы уже голосовали. это должно просто быть простой модификацией существующего кода.

ваш выбор должен быть изменен примерно так:

 SELECT ip_add FROM voting_ip WHERE mes_id_fk='$id' AND ip_add='$ip' AND timetamp>'$nowMinus24Hours' 

и ваша вставка должна быть чем-то вроде

 INSERT INTO voting_ip (mes_id_fk,ip_add,timestamp) values ('$id','$ip','$now') 

$ теперь можно установить в php, используя что-то вроде:

 $timestamp = new DateTime(); $now=$timestamp->format('Ymd H:i:s'); 

а затем $ nowMinus24Hours – это просто переменная = $ теперь минус 24 часа.

ПРИМЕЧАНИЕ. Вы можете сделать SELECT Count (ip_add) …. или выбрать счетчик (*) (Выбрать ..), чтобы получить количество записей в результате вашего запроса.