0

我有一个漫画网站,我想跟踪有多少人点击喜欢和不喜欢单个漫画 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>

像counter.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;

?>

它不会增加数据库值,也不会向浏览器报告值。有什么建议么?

谢谢!

4

3 回答 3

1

我认为

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

应该

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

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

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

于 2012-11-16T00:00:25.520 回答
1

我相信您需要将列名“like”更改为其他名称,因为该词在 SQL 中是保留的,这里是保留词列表

只需将其更改为“喜欢”或类似的东西。

另一件小事是您可以在单个查询中获取这两个值

Select likes,dislikes from $table where id = $ImgID
于 2012-11-16T00:32:21.920 回答
1

技术问题是这一行:

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

由于 site 和 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,这意味着你不能只是回显它,你必须做一个 fetch,因为你知道你只得到一个结果,你可以使用list($likes, $dislikes) = $result->fetch_array(MYSQLI_NUM);

阅读文档以帮助您了解我到底在做什么。

正如您所提到的,人们可以随心所欲地点击喜欢/不喜欢,您需要使用某种 IP 日志来限制这一点。例如使用以下字段设置一个新的数据库表;ip,表,imgid。然后当有人“喜欢”时记录他们的 IP:

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

然后在添加新的喜欢之前检查他们是否有记录:

$sql = "SELECT ip FROM xxx WHERE ip = \"".$_SERVER['REMOTE_ADDR']."\" AND table_name = "$table" AND imgid = $imgid";
$result = $mysqli->query($sql);
if($result->num_rows == 0) { ...if($input ==... }
于 2012-11-16T00:38:24.613 回答