jQuery+Ajax+PHP实现图片“喜欢”功能:防重复点击逻辑解析

咖啡半糖
咖啡半糖
发布时间:2026-10-13 | 4人浏览过
原创

本文介绍基于 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 防重复提交技巧的资料请关注本站其它相关文章!

本站声明

本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。

Python 相关产品和应用

全部下载

专题列表