PHP操作MySQL数据库记录与JSON数据返回完整指南
在使用PHP进行后台数据处理时,从MySQL数据库中获取记录并返回给前端是核心环节。本文将系统介绍如何查询数据库、计算记录总数、遍历结果集并将其序列化为JSON格式,同时详细解析 fetch_array、fetch_row 等函数的参数用法及分页处理逻辑。
结果或目标
掌握使用PDO或 mysqli 扩展连接 MySQL 数据库,并能灵活处理以下场景:
- 获取满足条件的记录总数。
- 遍历查询结果集并格式化输出。
- 将多维数组转换为 JSON 字符串供前端(如 Layui)调用。
- 理解不同 fetch 函数在索引与关联数组间的区别。
准备条件
环境要求:
- 已安装并运行 MySQL 服务。
- 配置好 PHP 运行环境(推荐 PHP 7.0+),并确保
php_mysqli扩展已启用。 - 准备好数据库配置文件(例如
linkConfig.php),其中定义了数据库主机、用户名、密码及库名。
第1步:建立数据库连接
首先引入数据库配置文件以确保安全认证,建议使用面向对象的方式初始化 MySQLi 对象。
<?php
require 'linkConfig.php'; // 引入连接配置
$mysqli = new mysqli($host, $user, $pass, $dbname);
if ($mysqli->connect_error) {
die('Connection failed: ' . $mysqli->connect_error);
}
$mysqli->set_charset("utf8");
?>
第2步:获取数据表的记录总数
当需要统计满足特定条件的行数时,使用 COUNT(*) 聚合函数配合 SQL 查询。
实现方案:
<?php
$sql = "SELECT COUNT(*) AS total FROM druserlist WHERE C04='普通用户'";
$result = $mysqli->query($sql);
$row = $result->fetch_assoc();
echo '记录总数:' . $row['total'];
// 释放资源并关闭连接
$result->free();
$mysqli->close();
?>
在此处也可以通过 fetch_row() 获取数值,如 $row[0],但在命名清晰的场景下,使用别名 AS total 更具可读性。
第3步:获取数据查询表记录并返回JSON格式
将多条记录封装为数组,并利用 json_encode 输出标准 JSON 数据,方便前端接收。
代码示例:
<?php
$sql = "SELECT * FROM druserlist";
$res = $mysqli->query($sql);
$result = array();
while ($row = $res->fetch_assoc()) {
array_push($result, $row);
}
header('Content-Type: application/json');
echo json_encode($result);
$res->free();
$mysqli->close();
?>
输出效果:
[
{"C01": "00924001", "C02": "经理办01", "C04": "普通用户"},
{"C01": "00924002", "C02": "经理办02", "C04": "普通用户"}
]
第4步:处理分页数据(以Layui为例)
Layui 表格通常要求返回包含 code、count(总条数)和 data(当前页数据)的对象。需根据前端传入的页码 (page) 和每页条数 (limit) 计算偏移量。
操作步骤:
- 获取请求参数并进行安全过滤(转为整型)。
- 先执行一次计数查询获取总页数。
- 再执行带
LIMIT offset, length子句的查询获取当前页数据。 - 组装符合 Layui 规范的结构化响应。
<?php
$page = isset($_POST['page']) ? intval($_POST['page']) : 1;
$limit = isset($_POST['limit']) ? intval($_POST['limit']) : 10;
$offset = ($page - 1) * $limit;
// 1. 获取总数
$sqlCount = "SELECT COUNT(*) as count FROM druserlist";
$resultCount = $mysqli->query($sqlCount);
$totalRow = $resultCount->fetch_assoc();
// 2. 获取分页数据
$sqlData = "SELECT * FROM druserlist ORDER BY C01 LIMIT $offset, $limit";
$resultData = $mysqli->query($sqlData);
$dataList = array();
while ($row = $resultData->fetch_assoc()) {
array_push($dataList, $row);
}
// 3. 构建统一返回结构
$returnArr = [
'code' => 0,
'msg' => '',
'count' => (int)$totalRow['count'],
'data' => $dataList
];
echo json_encode($returnArr);
$resultCount->free();
$resultData->free();
$mysqli->close();
?>
原文有依据的排错
在处理 MySQLi 结果集时,常见的错误是将索引与关联数组混用导致取值失败。请根据需求选择正确的提取函数:
解析 fetch_array 的参数差异
mysqli_fetch_array 默认返回两种类型的数组(索引和关联)。可以通过第二个参数控制输出类型:
MYSQLI_NUM:仅返回数字索引数组(如$row[0])。MYSQLI_ASSOC:仅返回关联数组(如$row['C01'])。MYSQLI_BOTH:同时返回上述两者(默认值)。
// 演示三种获取方式
while($row = mysqli_fetch_array($result, MYSQLI_ASSOC)){
echo $row['C01'].' ';
}
fetch_all 的使用注意事项
fetch_all(MYSQLI_ASSOC) 会将整个结果集一次性加载到内存中。适用于数据量较小的场景;若数据庞大,建议改用 fetch_assoc() 配合 while 循环逐行处理以节省内存。
简要总结
以上介绍了PHP操作MySQL数据库进行记录获取、分页转换及JSON返回的核心流程。重点在于合理使用 fetch_assoc 获取关联数组以便构建 JSON,以及利用 LIMIT 语句实现高效的数据分页。更多关于PHP数据库优化与前后端分离的资料请关注本站其它相关文章!
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









