0

0

如何实现在不刷新页面的情况下动态获取数据库新增商品信息

聖光之護

聖光之護

发布时间:2026-02-14 23:41:00

|

727人浏览过

|

来源于php中文网

原创

如何实现在不刷新页面的情况下动态获取数据库新增商品信息

本文介绍通过 ajax 轮询 + 后端增量查询方式,实现在用户浏览商城页时实时展示新上架商品,避免整页刷新或低效全量重载,兼顾性能与用户体验。

本文介绍通过 ajax 轮询 + 后端增量查询方式,实现在用户浏览商城页时实时展示新上架商品,避免整页刷新或低效全量重载,兼顾性能与用户体验。

在现代 Web 应用中,要求“页面不刷新即同步最新数据”已成为常见需求。您当前使用 setInterval 配合 .load() 全量重载 #players 区域的方式存在明显缺陷:每次请求都重新渲染全部商品,不仅浪费带宽与服务器资源,还可能引发重复 ID、事件绑定丢失、滚动位置跳动等问题;同时,$(".parent") 选择器错误(HTML 中为 id="parnet",且 class 未定义),导致脚本根本无法执行。

推荐采用增量拉取(Incremental Pull)+ 前端追加渲染方案,核心思路是:前端记录已加载商品的最大 ID(如 lastProdId),定时向后端请求该 ID 之后的新商品 HTML 片段,并仅将其追加到现有列表末尾。

✅ 正确实现步骤

1. 前端 JavaScript(使用 jQuery 示例)

<script>
$(document).ready(function() {
    // 初始化:从 DOM 中提取最后一条商品的 data-id(需在 PHP 循环中添加)
    let lastProdId = $('#players .col-lg-6').last().data('id') || 0;

    function fetchNewProducts() {
        $.get('/api/get-new-products.php', { lastProdId: lastProdId })
            .done(function(response) {
                try {
                    const res = JSON.parse(response);
                    if (!res.error && res.data && res.data.trim()) {
                        // 追加新商品 HTML 到 #players 容器内
                        $('#players').append(res.data);
                        // 更新 lastProdId 为最新商品 ID(假设返回 HTML 中最后一项含 data-id)
                        const newLastItem = $('#players .col-lg-6').last();
                        if (newLastItem.length) {
                            lastProdId = newLastItem.data('id') || lastProdId;
                        }
                    }
                } catch (e) {
                    console.warn('Invalid JSON response:', response);
                }
            })
            .fail(function() {
                console.error('Failed to fetch new products');
            });
    }

    // 每 3 秒轮询一次(避免过于频繁,生产环境建议 5–10s 或改用 WebSocket)
    setInterval(fetchNewProducts, 3000);
});
</script>

⚠️ 关键修改说明

  • 在 PHP 循环中为每个商品容器添加 data-id="= $player['id'] ?>" 属性,便于前端识别顺序;
  • 使用 $.get() 替代 .load(),实现可控的数据解析与条件追加;
  • lastProdId 动态更新,确保每次只拉取增量数据,避免重复或遗漏。

2. 后端 PHP 接口示例(/api/get-new-products.php)

<?php
header('Content-Type: application/json; charset=utf-8');

require_once 'db.php'; // 假设已建立 PDO 连接 $pdo

$lastProdId = (int)($_GET['lastProdId'] ?? 0);

$stmt = $pdo->prepare("
    SELECT id, playerName, buyPrice, marketPrice, price, image 
    FROM players 
    WHERE id > ? 
    ORDER BY id ASC 
    LIMIT 20
");
$stmt->execute([$lastProdId]);
$players = $stmt->fetchAll(PDO::FETCH_ASSOC);

$html = '';
foreach ($players as $player) {
    $html .= '<div class="col-lg-6 col-xl-3" data-id="' . htmlspecialchars($player['id']) . '">
        <div class="card text-center">
            <div class="card-body">
                <div class="row m-b-30">
                    <div class="col-md-5 col-xxl-6">
                        <div class="new-arrival-product mb-4 mb-xxl-4 mb-md-0">
                            <div class="new-arrivals-img-contnent">
                                <img class="img-fluid" src="' . baseUrl() . '/upload/images/players/' . htmlspecialchars($player['image']) . '" alt="">
                            </div>
                        </div>
                    </div>
                    <div class="col-md-7 col-xxl-6">
                        <div class="new-arrival-content position-relative">
                            <h4>' . htmlspecialchars($player['playerName']) . '</h4>
                            <p>Buy Now Price <span class="item text-success">' . htmlspecialchars($player['buyPrice']) . '</span></p><div class="aritcle_card flexRow">
                                                        <div class="artcardd flexRow">
                                                                <a class="aritcle_card_img" href="/ai/1735" title="Lumen5"><img
                                                                                src="https://img.php.cn/upload/ai_manual/000/969/633/68b6d1d0cc294934.png" alt="Lumen5"  onerror="this.onerror='';this.src='/static/lhimages/moren/morentu.png'" ></a>
                                                                <div class="aritcle_card_info flexColumn">
                                                                        <a href="/ai/1735" title="Lumen5">Lumen5</a>
                                                                        <p>一个在线视频创建平台,AI将博客文章转换成视频</p>
                                                                </div>
                                                                <a href="/ai/1735" title="Lumen5" class="aritcle_card_btn flexRow flexcenter"><b></b><span>下载</span> </a>
                                                        </div>
                                                </div>
                            <p>Market Price: <span class="item text-success">' . htmlspecialchars($player['marketPrice']) . '</span></p>
                            <p>Price In Dollar: <span class="item text-success">' . htmlspecialchars($player['price']) . '</span></p>
                        </div>
                        <button type="button" class="btn btn-rounded btn-primary btn-sm">
                            <span class="btn-icon-left text-primary"><i class="fa fa-shopping-cart"></i></span>Buy
                        </button>
                    </div>
                </div>
            </div>
        </div>
    </div>';
}

echo json_encode([
    'error' => false,
    'data'  => $html,
    'count' => count($players)
]);

安全与健壮性要点

  • 使用 htmlspecialchars() 防止 XSS;
  • 显式设置 Content-Type: application/json;
  • 限制单次返回数量(如 LIMIT 20),防止响应过大;
  • 若无新数据,$html 为空字符串,前端自动跳过追加。

? 注意事项与优化建议

  • 轮询频率权衡:高频轮询(如 1s)会显著增加服务器压力,建议初始设为 3–5s,后续可结合用户活跃度动态调整;
  • 替代方案进阶:长期项目推荐升级为 Server-Sent Events (SSE) 或 WebSocket,实现服务端主动推送;
  • 防抖与错误处理:可在 fetchNewProducts() 中加入失败重试机制(如指数退避),并提供 UI 状态提示(如“正在同步…”);
  • SEO 与首屏体验:服务端仍需完整渲染初始商品列表(您当前的 PHP 循环保留),AJAX 仅负责后续增量更新,确保无 JS 时基础功能可用。

通过以上结构化实现,您将获得一个轻量、可靠、可维护的实时商品同步能力——无需刷新,却始终新鲜。

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
json数据格式
json数据格式

JSON是一种轻量级的数据交换格式。本专题为大家带来json数据格式相关文章,帮助大家解决问题。

437

2023.08.07

json是什么
json是什么

JSON是一种轻量级的数据交换格式,具有简洁、易读、跨平台和语言的特点,JSON数据是通过键值对的方式进行组织,其中键是字符串,值可以是字符串、数值、布尔值、数组、对象或者null,在Web开发、数据交换和配置文件等方面得到广泛应用。本专题为大家提供json相关的文章、下载、课程内容,供大家免费下载体验。

544

2023.08.23

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

318

2023.10.13

go语言处理json数据方法
go语言处理json数据方法

本专题整合了go语言中处理json数据方法,阅读专题下面的文章了解更多详细内容。

81

2025.09.10

jquery插件有哪些
jquery插件有哪些

jquery插件有jQuery UI、jQuery Validate、jQuery DataTables、jQuery Slick、jQuery LazyLoad、jQuery Countdown、jQuery Lightbox、jQuery FullCalendar、jQuery Chosen和jQuery EasyUI等。本专题为大家提供jquery插件相关的文章、下载、课程内容,供大家免费下载体验。

154

2023.09.12

jquery怎么操作json
jquery怎么操作json

操作的方法有:1、“$.parseJSON(jsonString)”2、“$.getJSON(url, data, success)”;3、“$.each(obj, callback)”;4、“$.ajax()”。更多jquery怎么操作json的详细内容,可以访问本专题下面的文章。

318

2023.10.13

jquery删除元素的方法
jquery删除元素的方法

jquery可以通过.remove() 方法、 .detach() 方法、.empty() 方法、.unwrap() 方法、.replaceWith() 方法、.html('') 方法和.hide() 方法来删除元素。更多关于jquery相关的问题,详情请看本专题下面的文章。php中文网欢迎大家前来学习。

403

2023.11.10

jQuery hover()方法的使用
jQuery hover()方法的使用

hover()是jQuery中一个常用的方法,它用于绑定两个事件处理函数,这两个函数将在鼠标指针进入和离开匹配的元素时执行。想了解更多hover()的相关内容,可以阅读本专题下面的文章。

509

2023.12.04

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

76

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号