jQuery+Ajax+PHP实现图片“喜欢”功能:防重复点击逻辑解析
本文介绍基于 jQuery、Ajax 和 PHP 实现图片“喜欢”评级功能的完整方案。该功能通过前端异步请求避免页面刷新,并利用后端 IP 地址校验机制防止用户重复点击,确保数据统计的准确性。
目标与准备条件
本例旨在实现一个用户点击红心按钮即可增加图片“喜欢”数值的功能。核心难点在于如何在不刷新页面的情况下更新数据,以及如何限制同一用户重复提交无效请求。需要准备的环境包括支持 PHP 和 MySQL 的服务端环境,以及引入 jQuery 库的前端页面。
数据库结构设计
为了支持计数和防重逻辑,我们需要两张表:pic 用于存储图片信息及当前总喜欢数,pic_ip 用于记录已点击过该图片的用户 IP 地址。
第1步:创建图片信息表 pic
目的:存储图片元数据及累计点赞数。
说明: love 字段初始值为 0,用于存储整数类型的计数。
CREATE TABLE IF NOT EXISTS `pic` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pic_name` varchar(60) NOT NULL,
`pic_url` varchar(60) NOT NULL,
`love` int(11) NOT NULL DEFAULT '0',
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
第2步:创建 IP 记录表 pic_ip
目的:追踪哪些 IP 已经点击过特定图片,用于去重判断。
参数: 联合记录 pic_id 和 ip。
CREATE TABLE IF NOT EXISTS `pic_ip` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`pic_id` int(11) NOT NULL,
`ip` varchar(40) NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
前端页面实现 (index.php)
前端主要任务是展示图片列表,并在点击事件中触发 Ajax 请求。这里使用 jQuery 简化 DOM 操作和网络请求。
第3步:构建 HTML 结构与 CSS 样式
入口: index.php
动作: 遍历数据库中的图片,生成包含红心链接的列表项。
关键参数: rel 属性绑定图片 ID,用于后续 Ajax 传递。
CSS 要点: 红心图标通过背景图定位实现悬停效果,按钮绝对定位在图片左上角。
<!DOCTYPE HTML>
<html>
<head>
<meta charset="utf-8">
<title>jQuery+Ajax+PHP实现"喜欢"</title>
<!-- 假设 main.css 中定义了 .list, .img_on 等样式 -->
<link rel="stylesheet" type="text/css" href="../css/main.css" />
<script src="https://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
<style>
/* 简单示意,具体样式参考 original CSS */
.list li { position: relative; }
.list li p a { color: #fff; font-weight: bold; }
</style>
</head>
<body>
<div id="main">
<ul class="list">
<?php
include_once("connect.php");
$sql = mysql_query("select * from pic");
while($row=mysql_fetch_array($sql)){
$id = $row['id'];
$name = $row['pic_name'];
$url = $row['pic_url'];
$love = $row['love'];
?>
<li>
<img src="images/<?php echo $url; ?>" alt="<?php echo $name; ?>">
<p><a href="#" title="我喜欢" class="img_on" rel="<?php echo $id; ?>"><?php echo $love; ?></a></p>
</li>
<?php } ?>
</ul>
</div>
</body>
</html>
第4步:添加 jQuery 交互逻辑
目的:拦截默认链接跳转,发起 Ajax POST 请求。
操作顺序: 获取图片 ID → 渐隐当前按钮 → 发送请求 → 接收新数值 → 更新按钮文本 → 渐显按钮。
$(function(){
$("p a.img_on").click(function(e){
e.preventDefault(); // 阻止默认链接行为
var $btn = $(this);
var id = $btn.attr("rel"); // 获取绑定的图片ID
// 视觉反馈:先隐藏以便后续更新
$btn.fadeOut(300);
$.ajax({
type: "POST",
url: "love.php",
data: "id=" + id,
cache: false,
success: function(data){
// data 是后端返回的新数值或提示文字
$btn.html(data);
$btn.fadeIn(300);
}
});
});
});
后端处理逻辑 (love.php)
后端脚本负责验证 IP、更新计数并返回结果。注意:原文使用了已废弃的 mysql_* 函数,实际生产环境建议升级为 mysqli 或 PDO 以防范 SQL 注入风险。
第5步:编写 PHP 处理脚本
入口: love.php
重要参数: $_POST['id'] 为图片 ID,get_client_ip() 获取访客 IP。
逻辑判断:
1. 检查 pic_ip 表中是否存在该 pic_id 和 ip 的组合。
2. 若存在,输出 "喜欢过了.."。
3. 若不存在,执行更新 pic.love + 1,插入新的 IP 记录,查询最新 love 值并输出。
<?php
$host="localhost";
$db_user="root";
$db_pass="";
$db_name="demo";
$link=@mysql_connect($host,$db_user,$db_pass);
if(!$link) die('Connect Error');
mysql_select_db($db_name,$link);
mysql_query("SET names UTF8");
// 获取参数
$id = isset($_POST['id']) ? $_POST['id'] : '';
if(empty($id)) exit;
$ip = get_client_ip();
// 检查是否已点过
$check_sql = "SELECT ip FROM pic_ip WHERE pic_id='$id' AND ip='$ip'";
$res = mysql_query($check_sql);
$count = mysql_num_rows($res);
if($count == 0){
// 未点过:更新计数并记录IP
$update_sql = "UPDATE pic SET love=love+1 WHERE id='$id'";
mysql_query($update_sql);
$insert_sql = "INSERT INTO pic_ip (pic_id,ip) VALUES ('$id','$ip')";
mysql_query($insert_sql);
// 获取最新计数返回前端
$result = mysql_query("SELECT love FROM pic WHERE id='$id'");
$row = mysql_fetch_array($result);
echo $row['love'];
} else {
// 已点过:返回提示
echo "喜欢过了..";
}
/**
* 获取用户真实IP函数
*/
function get_client_ip() {
if(getenv("HTTP_CLIENT_IP") && strcasecmp(getenv("HTTP_CLIENT_IP"), "unknown"))
$ip = getenv("HTTP_CLIENT_IP");
elseif(getenv("HTTP_X_FORWARDED_FOR") && strcasecmp(getenv("HTTP_X_FORWARDED_FOR"), "unknown"))
$ip = getenv("HTTP_X_FORWARDED_FOR");
elseif(getenv("REMOTE_ADDR") && strcasecmp(getenv("REMOTE_ADDR"), "unknown"))
$ip = getenv("REMOTE_ADDR");
elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], "unknown"))
$ip = $_SERVER['REMOTE_ADDR'];
else
$ip = "unknown";
return ($ip);
}
?>
完成判断与安全提示
当用户在页面上点击红心后,如果 IP 未被记录,数字应瞬间增加;如果已被记录,则显示中文提示。此方案通过简单的 IP 过滤实现了基础的防刷机制。
注意:
1. 安全性: 示例代码使用 mysql_* 扩展且直接拼接变量,存在 SQL 注入风险。在现代开发中,请务必使用 prepared statements (预处理语句)。
2. IP 局限性: 同一内网下的多个用户可能拥有相同出口 IP,导致其中一人无法点赞。对于高并发或严格身份验证场景,建议使用用户登录后的 ID 进行去重。
简要总结
通过以上步骤,我们构建了一个完整的基于 jQuery 和 PHP 的“喜欢”功能模块。它展示了前端异步通信与后端状态管理的基本交互模式。从数据库设计到 JS 事件绑定,再到 PHP 的逻辑分支,各环节紧密配合实现了用户体验与数据一致性的平衡。
以上就是 jQuery+Ajax+PHP 实现图片“喜欢”评级功能的详细内容,更多关于 PHP 防重复提交技巧的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









