我有一个漫画网站,我想跟踪有多少人点击喜欢和不喜欢单个漫画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;
?>
它没有递增数据库值,也没有向浏览器报告值。有什么建议吗?
谢谢!
答案 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);