实现facebook风格的“不同”功能

时间:2013-02-22 15:22:54

标签: php mysql

我最近为我的漫画网站实施了自定义喜欢和不喜欢的功能。我想让用户通过“取消点击”喜欢或不喜欢的按钮来“收回”他们的选择。

我的功能是:

  

1)通过Jquery传递按钮值(id ='like'或id ='dislike')   php脚本

     

2)脚本将首先检查数据库中是否存在ip   给出漫画ID ...如果不是它将插入用户的IP和当前   漫画ID ...如果确实如此,它最初说“你已经投票了”......但现在实施“不喜欢”,我只会让它运行删除查询

     

3)然后它将获得该漫画ID的总流量   增量。

我认为可以做到的方式是,如果用户再次按下按钮,我基本上运行相反的查询...从表中删除该用户的投票给出漫画ID ...然后减少该图像的总喜欢在漫画表中。

所以我的问题是

  

1)如果他们按一次按钮,然后删除,则进行插入查询   查询他们是否“取消选择”同一选择的最佳实施方式   这个?用户无法连续发送垃圾邮件并使数据库过载   按下喜欢按钮,从而不断喜欢和不喜欢?   我应该为该ID实现某种$ _SESSION ['count']吗?

     

2)如果我正在存储某个IP ...如果有几个uniques,会发生什么   用户碰巧使用同一台计算机...让我们说一个netcafe ...它   将始终存储该用户的IP。存储对IP最好   要走的路?

如果您需要参考代码:

<?php 
include 'dbconnect.php';
$site = $_GET['_site'];
$imgid = intval($_GET['_id']);
$input = $_GET['_choice'];

if ($site == "artwork") {
$table = "artwork";
}
else {
$table = "comics";
}

$check = "SELECT ip, tablename, imgid FROM votes WHERE ip = '".$_SERVER['REMOTE_ADDR']."' AND tablename = '$table' AND imgid = $imgid";
$result = $mysqli->query($check);

if ($result->num_rows == 0) { 
    //Insert voter's information into votes table
    $sql = "INSERT INTO 
            votes (ip, tablename, imgid) 
        VALUES 
            (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)
        ON DUPLICATE KEY UPDATE
            imgid = VALUES(imgid)";

        if (!$mysqli->query($sql)) printf("Error: %s\n", $mysqli->error); 

        /*while ($row = $result->fetch_assoc()) {
            echo "you've inserted: " . $row['ip'] . ", " . $row['tablename'] . ", " . $row['imgid'] . ".";
        }*/

        $result = $mysqli->query("SELECT like_count, dislike_count FROM $table WHERE id = $imgid"); 

        //put the counts into a list
        list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);     

        if ($input == "like") {
            $sql = "UPDATE $table SET like_count = like_count + 1 WHERE id = $imgid";
            $mysqli->query($sql);           
            $likes++;
        }
        else if ($input == "dislike") {
            $sql = "UPDATE $table SET dislike_count = dislike_count + 1 WHERE id = $imgid";
            $mysqli->query($sql);
            $dislikes++;    
        }
    } 
else { //"unlike" their previous like for that given image id
        $sql = "DELETE FROM
                    votes 
                WHERE (ip, tablename, imgid) = 
                    (\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)";

        if (!$mysqli->query($sql)) printf("Error: %s\n", $mysqli->error); 

        $result = $mysqli->query("SELECT like_count, dislike_count FROM $table WHERE id = $imgid"); 

        //put the counts into a list
        list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);     

        if ($input == "like") { //remove like
            $sql = "UPDATE $table SET like_count = like_count - 1 WHERE id = $imgid";
            $mysqli->query($sql);           
            $likes--;
        }
        else if ($input == "dislike") {
            $sql = "UPDATE $table SET dislike_count = dislike_count - 1 WHERE id = $imgid";
            $mysqli->query($sql);
            $dislikes--;    
        }
}

echo "Likes: " . $likes . ", Dislikes: " . $dislikes;

mysqli_close($mysqli);

?>

1 个答案:

答案 0 :(得分:1)

1)我会说是的,使用计数功能来限制他们可以连续按下按钮的次数。可能不会有太多麻烦,除非它们达到非常高的数字,我相信一个简单的循环就可以了。

2)我不会只存储IP。我会尝试使用不仅仅是IP作为标识符的东西,比如IP和会话cookie - 这是唯一的。但是在回顾服务器时,您必须解析数据库中的条目。或者也许是mac地址。我不确定你是否可以访问它。 How can I get the MAC and the IP address of a connected client in PHP?

我确信还有另一种方式,但从概念上讲,这就是我看到它的运作方式。