使用php和jquery实现like / dislike计数器

时间:2012-11-15 23:54:21

标签: php javascript jquery

我有一个漫画网站,我想跟踪有多少人点击喜欢和不喜欢单个漫画ID ...我想将值存储在我的数据库中,并将其报告回来到浏览器。

这是我的非工作解决方案:

viewcomic.php:

    <script type="text/javascript">
    function likeCounter(choice) {    
       var site = $("#site").val();
       var imgid = $("#imgid").val();
       $.get("./scripts/likecounter.php", {_choice : choice, _site : site, _id : imgid},
            function(returned_data) {
                $("#choice").html(returned_data);
            }
        );
}
</script>
       //Changed to try and work with buttons
   <button id="like" onClick="likeCounter(this.id)">Like</button>
   <button id="dislike" onClick="likeCounter(this.id)">Dislike</button>
   <input id="site" type="hidden" value="<?php echo $site; ?>">
   <input id="imgid" type="hidden" value="<?php echo $imgid; ?>">

<br />
Likes: <span id="choice"></span>

likecounter.php

<?php 
include 'dbconnect.php';

$site = $_GET['_site'];
$imgid = $_GET['_id'];
$input = $_GET['_choice'];

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

$likes = $mysqli->query("SELECT like FROM $table WHERE id = $imgid");
$dislikes = $mysqli->query("SELECT dislike FROM $table WHERE id = $imgid");


if ($input == "like") {
   $sql = "UPDATE $table SET like = like + 1 WHERE id = $imgid";
   $mysqli->query($sql);
   $likes++;

else if ($input == "dislike") {
   $sql = "UPDATE $table SET like = dislike + 1 WHERE id = $imgid";
   $mysqli->query($sql);
   $dislikes++;
}   
mysqli_close($mysqli);

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

?>

它没有递增数据库值,也没有向浏览器报告值。有什么建议吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

我认为

$site = $_GET['site'];`

应该是

$site = $_GET['_site'];` 

您也没有发送id - $imgid = $_GET['id'];

请查看PDO或MySQLi,因为您的代码不安全(查找SQL注入)。

答案 1 :(得分:1)

我相信您需要将列名称“like”更改为其他内容,因为SQL中保留的这个单词是list of reserved words

只需将其更改为“喜欢”或类似内容。

另一个小问题是你可以在一个查询中获得这两个值

Select likes,dislikes from $table where id = $ImgID

答案 2 :(得分:1)

技术问题是这一行:

$.get("./scripts/likecounter.php", {_choice : choice, _site : site, _id : id}...

由于网站和ID未定义,您将收到javascript错误ReferenceError: site is not defined

尝试:

$.get("./scripts/likecounter.php", {_choice : choice, _site : "<?php echo $site; ?>", _id : "<?php echo $imgid; ?>"}...

您不需要隐藏的输入,onClick也应该是onclick

其他快速建议:

确保$ imgid实际上是一个整数:

$imgid = intval($_GET['_id']);
if($imgid == 0) exit('Invalid id');

以下内容无需分开:

$likes = $mysqli->query("SELECT like FROM $table WHERE id = $imgid");
$dislikes = $mysqli->query("SELECT dislike FROM $table WHERE id = $imgid");

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

$mysqli->query只会返回一个mysqli_result,这意味着你不能只是回应它,你必须进行一次获取,因为你知道你只得到一个结果,你可以使用{{ 1}}

阅读docs,以帮助您了解我正在做些什么。

正如你所提到的那样,人们可以随心所欲地拒绝/不喜欢他们想要的东西,你需要用某种IP日志来限制它。例如,使用以下字段设置新数据库表; ip,table,imgid。然后当有人“喜欢”记录他们的IP时:

list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);

然后在添加新内容之前检查他们是否有记录:

$sql = "INSERT INTO xxx (ip, table_name, imgid) VALUES(\"".$_SERVER['REMOTE_ADDR']."\", \"$table\", $imgid)";
$mysqli->query($sql);