在没有用户登录的情况下将功能限制为每个IP地址一次

时间:2016-06-13 17:55:38

标签: php mysql

我正在构建一个网站,允许您发布评论到页面并对其他评论进行投票,除非它是匿名的,没有任何用户登录。

我已经有一个评论评级系统,但目前没有什么可以阻止某人反复评论他们内心的评论。

一旦你投票,我需要这样做,就是这样。你不能再回头了,你不能再在同一个帖子上投票了。

这是一个例子,我的rateup.php文件:

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

$post_id = $_GET['id'];

// Connection to database
$connection=mysqli_connect("$servername","$username","$password","$dbname");
// Check connection
if (mysqli_connect_errno()) {
    echo 'oops';
    //echo "Failed to connect to MySQL: " . mysqli_connect_error();
}

// Increasing the current value with 1

mysqli_query($connection,"UPDATE $tablename SET upvotes = (upvotes + 1) WHERE id = $post_id");
mysqli_close($connection);

echo 'done';   ?>

老实说,我很难想到如何解释这个问题。

谢谢!

3 个答案:

答案 0 :(得分:1)

我在我的一个项目中做过类似的事情。

以这种方式制作一张桌子: -

127.0.0.1

现在在此表中,存储&#34; upvotes&#34;。因此,如果使用ip 456使用评论ID为SELECT COUNT(*) as total from table where comment_id = ? AND IP = ? 的评论,则为其添加一行。

现在,每次点击(upvote按钮)绑定ajax请求,只要有人点击进行&#34; upvote&#34;,请求就会转到带有注释ID的ajax处理程序页面。在此页面上,使用此数据获取用户的IP并查询您是否有记录。

total

如果<html lang="en"> 1 ,则表示用户正在尝试进行第二次投票,如果没有,则投票是合法的,然后继续。

答案 1 :(得分:0)

您需要将用户IP和浏览器指纹信息存储在数据库表中,而不是添加/修改内容的用户名。因此,例如,如果您有upvotes表,您的架构就像:

commentid, text, creation_date, created_by

其中created_by字段是用户的IP地址。此外,您可以存储来自$ _REQUEST的其他一些变量,这些变量可以帮助您唯一地识别访问者。

所有这些措施都不是万无一失的,因为通常用户会坐在动态IP和NAT防火墙后面,所以他们的IP可能会经常变化。

希望有所帮助。

答案 2 :(得分:0)

创建一个新表以保存每个投票的IP地址:

CREATE TABLE IP_post_votes (
    post_id INT
    ip varchar(15)
);

现在,每当您更新upvote表时,都应检查IP_post_votes表中的ips,并在事务中插入(如果不存在)。此外,WHERE NOT EXISTS子句将提供比计数数据的一个查询和更新数据的另一个查询的最佳性能:

mysqli_begin_transaction($connection);
mysqli_query($connection,"UPDATE $tablename SET upvotes = (upvotes + 1) WHERE id = $post_id AND NOT EXISTS (SELECT 1 FROM IP_post_votes where IP = $ip and post_id = $post_id)");

if(mysqli_affected_rows() > 0) {
    $insert = mysqli_query($connection,"INSERT INTO IP_post_votes values($post_id, $ip)");
    $insert ? 
        mysqli_commit($connection):
        mysqli_rollback($connection);
} else {
    mysqli_rollback($connection);
}