使用 PHP 原生 MySQL 与 XMLHttpRequest 实现无刷新分页

Jasper
Jasper
发布时间:2026-10-14| 5人浏览过
原创

通过结合原生PHP后端逻辑与JavaScript的XMLHttpRequest对象,可以实现无需重载页面的数据分页功能。本文将拆解index.php、ajaxpg.js及CSS文件的核心代码,演示如何构建基于传统技术的异步分页系统。

核心功能与结构

该方案旨在通过前端异步请求获取指定页码的数据,并替换页面局部内容。主要涉及四个部分:

  • index.php: 负责数据库连接、分页计算及HTML渲染。
  • ajaxpg.js: 封装XMLHttpRequest对象,处理HTTP请求与响应。
  • page.css: 定义分页导航的样式。
  • SQL脚本: 提供测试用的数据库表结构与初始数据。

准备工作

  1. 数据库配置: 确保本地或服务器已安装MySQL,并创建名为 demo 的数据库。导入提供的 brand.sql 文件以填充测试数据(表名 brand)。
  2. 文件布局: 在Web服务器根目录下建立文件结构:
    - index.php(主文件) - ajaxpg.js(JS脚本) - page.css(样式文件)
  3. 环境检查: 本示例基于较早期的PHP版本(如5.x)和原生DOM技术编写。若在现代PHP 7/8环境中运行,需注意废弃的函数(如 mysql_connect),实际生产中建议迁移至 PDO 或 mysqli。

第1步:配置主页面逻辑 (index.php)

此文件包含分页的核心算法与前端视图。它接收URL参数中的 page 值,计算偏移量,并从数据库查询数据。

1.1 引入资源与初始化

首先设置字符编码以避免乱码,并引入外部JS与CSS文件:

<?php 
header("Content-type: text/html;charset=GBK"); // 注意:根据实际数据库字符集调整,若为utf8则改为utf-8
?>
<html>
<head>
<title>ajax分页演示</title>
<script language="javascript" src="ajaxpg.js"></script>
<link rel="stylesheet" type="text/css" href="page.css">
</head>

1.2 分页参数计算

从GET请求中获取当前页码,默认为1。设定每页显示数量(例如 $num=10 或代码中的3用于测试),并连接数据库:

$page=isset($_GET['page'])?intval($_GET['page']):1;
$num=3; // 每页显示条数,调试时可调整为10或其他值

$db=mysql_connect("localhost","root","123456"); // 请替换为您的数据库账号密码
mysql_select_db("demo",$db) or die("数据库链接错误");
mysql_query("set names gbk"); // 若数据库为utf8,请改为 set names utf8

1.3 数据总量与页码范围

查询总记录数以计算总页数,并确定当前页是否在有效范围内:

$result=mysql_query("select * from brand");
$total=mysql_num_rows($result);
$url='index.php'; // AJAX提交的URL,指向自身以获取新页数据
$pagenum=ceil($total/$num);
$page=min($pagenum,$page); // 防止页码超出总数
$prepg=$page-1; // 上一页
$nextpg=($page==$pagenum ? 0 : $page+1); // 下一页,末页时设为0表示不可用
$offset=($page-1)*$num; // SQL LIMIT 的第一个参数

1.4 生成分页导航HTML

构建导航条字符串,包含首页、上一页、下一页、尾页及当前页信息。点击事件绑定到JS函数 dopage:

$pagenav="<ul>";
$pagenav.="<li>显示第 <B>".($total?($offset+1):0)."</B>-<B>".min($offset+$num,$total)."</B> 条记录</li>";
if($pagenum<=1) { /* 只有一页,无需分页 */ } else {
    $pagenav.="<li><a href=javascript:dopage('results','$url?page=1')>首页</a></li>";
    if($prepg) $pagenav.="<li><a href=javascript:dopage('results','$url?page=$prepg')>前页</a></li>";
    else $pagenav.="<li>前页</li>";
    if($nextpg) $pagenav.="<li><a href=javascript:dopage('results','$url?page=$nextpg')>后页</a></li>";
    else $pagenav.="<li>后页</li>";
    $pagenav.="<li><a href=javascript:dopage('results','$url?page=$pagenum')>尾页</a></li>";
}
$pagenav.="<li>第 $page 页 / 共 $pagenum 页</li></ul>";

第2步:实现Ajax异步请求 (ajaxpg.js)

JavaScript文件负责处理浏览器兼容性并发起HTTP GET请求。核心流程如下:

2.1 创建XHR对象

支持Mozilla系(使用 XMLHttpRequest)和IE浏览器(使用 ActiveXObject)。这是旧版浏览器的兼容写法,现代开发可直接使用 new XMLHttpRequest() 或 fetch/Axios。

var http_request=false;
function send_request(url){
    http_request=false;
    if(window.XMLHttpRequest){
        http_request=new XMLHttpRequest();
        if(http_request.overrideMimeType) http_request.overrideMimeType("text/xml");
    }
    else if(window.ActiveXObject){
        try{ http_request=new ActiveXObject("Msxml2.XMLHttp"); }
        catch(e){
            try{ http_request=new ActiveXObject("Microsoft.XMLHttp"); }
            catch(e){} 
        }
    }
    if(!http_request){
        window.alert("创建XMLHttp对象失败!");
        return false;
    }
    http_request.onreadystatechange=processrequest;
    http_request.open("GET",url,true);
    http_request.send(null);
}

2.2 处理响应

当请求状态为4(完成)且状态码为200(成功)时,将返回的HTML文本插入到指定的DOM元素中:

function processrequest(){
    if(http_request.readyState==4){
        if(http_request.status==200){
            document.getElementById(reobj).innerHTML=http_request.responseText;
        }else{
            alert("您所请求的页面不正常!");
        }
    }
}

// 触发函数
var reobj="";
function dopage(obj,url){
    document.getElementById(obj).innerHTML="<font color='green'>正在读取数据...</font>";
    send_request(url);
    reobj=obj; // 保存目标容器ID
}

第3步:配置样式与数据库

CSS样式 (page.css):

简单的列表样式,确保分页按钮横向排列且美观:

#result ul li {
    height:20px; width:auto; display:block; float:left;
    list-style:none; margin-left:5px; border:1px solid #999;
    background:#09C; color:#fff; text-decoration:none;
}
#result ul li a:hover { color:#F60; }

数据库 (SQL):

确保数据库中存在 brand 表,结构如下:

CREATE TABLE `brand` (
  `id` int(7) NOT NULL auto_increment,
  `sp_brand` varchar(255) default NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=19 ;
-- 需插入相应测试数据

完成判断与常见问题

完成后打开 index.php,点击“下一页”观察页面是否仅更新数据区域而整体不刷新。若出现乱码,请检查PHP的 header 设置、数据库连接时的 set names 指令以及HTML页面的charset是否一致(均为GBK或UTF-8)。 若在现代PHP版本中报错,主要是因为 mysql_*_connect 系列函数已被移除。解决方法是将数据库连接替换为 mysqli 或 PDO,并修正相应的查询语句。 以上就是PHP + Ajax实现无刷新数据分页的详细内容,更多关于PHP分页,Ajax无刷新,原生MySQL,javascript分页,xhr对象的资料请关注本站其它相关文章!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。