如何在Php + Mysql投票中限制IP每天的投票?

时间:2016-03-28 20:25:17

标签: php mysql voting-system

您好我已经将此投票脚本附加它按IP地址计票。请问如何在IP地址上创建一种时间会话。 “每个IP每天说5票。选民必须再等24小时再投票。我知道有这样的问题。我试过很少,但我无法让它发挥作用。 感谢。

更新脚本;

<?php
include("config.php");

$ip=$_SERVER['REMOTE_ADDR']; 


$add_time = new DateTime(null, new DateTimeZone('Europe/London'));
$time=$add_time->format('Y-m-d 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;

}
?>

3 个答案:

答案 0 :(得分:0)

最简单的方法是限制每个时间框架的投票次数,当人们在您的voting_ip表格中投票时,它会存储时间戳...然后在他们下次投票时,计算您投票表格中的所有记录其时间戳大于(当前时间--24小时)的ID。如果计数是&gt; = 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('Y-m-d H:i:s'); 

然后$ nowMinus24Hours只是一个变量= $ now减去24小时。

注意:您可以执行SELECT Count(ip_add)....或Select count(*)(Select ..)以获取查询结果的记录数。

答案 1 :(得分:0)

您可以在'voting_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 :(得分:0)

请考虑以下内容......其中我尝试反复执行相同的查询,间隔约为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>