php开发实战分析(8):优化MySQL分页查询与数量统计,提升数据库性能
在开发过程中,我们遇到了一段用于从数据库中查询部门信息的PHP代码。该代码负责根据不同的条件(如部门名称和来源)筛选数据,并返回分页结果及总记录数。然而,原始代码存在一些问题,包括重复的查询条件构建逻辑、缺乏对SQL注入的防护以及代码逻辑不够清晰。
如:
$sql = "select depart_id,md5(concat(depart_id,'LOCKDATAV')) AS depart_code,depart_name,depart_origin,depart_sort FROM " . $db->table("depart") . " WHERE 1";
if ($depart_name != "") {$sql .= " AND depart_name like '%" . $depart_name . "%'";
}if ($depart_origin != "") {$sql .= " AND depart_origin = " . $depart_origin;
}$sql .= " ORDER BY depart_id DESC LIMIT " . $limit . "," . $pagesize;
$row = $db->queryall($sql);//获取总记录;
$sql_c = "select depart_id FROM " . $db->table('depart') . " WHERE 1";
if ($depart_name != "") {$sql_c .= " AND depart_name like '%" . $depart_name . "%'";
}
if ($depart_origin != "") {$sql_c .= " AND depart_origin = " . $depart_origin;
}
$sql .= " ORDER BY depart_id";
$row_c = $db->queryall($sql_c);/*信息输出*/
$res['code'] = 0;
$res['msg'] = 0;
$res['count'] = count($row_c);
$res["data"] = $row;
die(json_encode_lockdata($res));
上面代码是用于从数据库中查询部门(depart
)的信息,并返回一个JSON格式的结果:
数据查询部分
-
SQL语句构建:
- 初始的SQL语句选择了
depart_id
,depart_code
(通过MD5哈希函数计算出的值),depart_name
,depart_origin
, 和depart_sort
字段。 depart_code
是通过将depart_id
和字符串'LOCKDATAV'
连接后进行MD5哈希计算得到的。这可能用于生成唯一的标识符或密钥。- SQL语句使用了表别名
$db->table("depart")
,这通常是一个方法调用,用来确保表名的正确性,比如添加前缀等。
- 初始的SQL语句选择了
-
条件过滤:
- 如果变量
$depart_name
不为空,则在SQL语句中加入一个条件,使结果只包含名称中包含$depart_name
的记录。 - 同样地,如果
$depart_origin
不为空,则进一步限制结果为特定来源的部门。
- 如果变量
-
排序与分页:
- 结果按照
depart_id
降序排列。 - 使用
LIMIT
子句实现分页功能,$limit
和$pagesize
变量定义了从哪一行开始以及返回多少行数据。
- 结果按照
-
执行查询:
- 使用
$db->queryall($sql)
执行SQL查询,获取所有匹配的记录。这里假设$db
是一个数据库连接对象,提供了查询数据库的方法。
- 使用
获取总记录数
- 构建了一个类似的SQL语句来计算符合条件的总记录数,但是没有包括
ORDER BY
和LIMIT
子句,因为这些对于计数操作是不必要的。 - 执行查询并获取所有符合条件的记录数量,存储在
$row_c
中。
结果组装
- 创建了一个数组
$res
,其中包含了响应的状态码 (code
)、消息 (msg
)、总记录数 (count
) 以及查询到的数据 (data
)。 - 使用
json_encode_lockdata
函数将结果转换为JSON格式,并输出。
安全性和性能考虑
- SQL注入风险:直接将用户输入(如
$depart_name
和$depart_origin
)拼接到SQL语句中存在SQL注入的风险。建议使用预处理语句或者参数化查询来避免这个问题。 - 性能优化:在获取总记录数时,可以考虑使用
COUNT(*)
而不是SELECT *
来减少数据传输量,提高效率。
// 构建基本查询条件
$base_sql = "SELECT depart_id, MD5(CONCAT(depart_id, 'LOCKDATAV')) AS depart_code, depart_name, depart_origin, depart_sort FROM " . $db->table("depart") . " WHERE 1";// 构建计数查询条件
$count_sql = "SELECT COUNT(*) AS total_count FROM " . $db->table("depart") . " WHERE 1";// 添加查询条件
$conditions = [];
$params = [];if (!empty($depart_name)) {$conditions[] = "depart_name LIKE ?";$params[] = '%' . $depart_name . '%';
}if (!empty($depart_origin)) {$conditions[] = "depart_origin = ?";$params[] = $depart_origin;
}if (!empty($conditions)) {$base_sql .= ' AND ' . implode(' AND ', $conditions);$count_sql .= ' AND ' . implode(' AND ', $conditions);
}// 构建完整的查询语句
$base_sql .= " ORDER BY depart_id DESC LIMIT :limit, :pagesize";
$params[] = (int)$limit;
$params[] = (int)$pagesize;// 执行查询
$row = $db->queryall($base_sql, $params);// 执行计数查询
$row_c = $db->queryone($count_sql, $params);/* 信息输出 */
$res = ['code' => 0,'msg' => '','count' => $row_c['total_count'],'data' => $row
];echo json_encode_lockdata($res);
- 减少重复代码:查询条件部分在两个SQL语句中是相同的,可以将其提取出来,避免重复编写。
- 安全性和性能:使用预编译语句来防止SQL注入攻击,并可能提高查询性能。
- 逻辑清晰:确保代码逻辑清晰,易于理解和维护。
@漏刻有时
相关文章:
php开发实战分析(8):优化MySQL分页查询与数量统计,提升数据库性能
在开发过程中,我们遇到了一段用于从数据库中查询部门信息的PHP代码。该代码负责根据不同的条件(如部门名称和来源)筛选数据,并返回分页结果及总记录数。然而,原始代码存在一些问题,包括重复的查询条件构建逻…...

shell脚本案例:RAC配置多路径时获取磁盘设备WWID和磁盘大小
使用场景 在RAC配置多路径时,需要获取到磁盘设备的wwid。因为RAC的磁盘配置是提前规划好的,只知道wwid,不知道磁盘对应大小,是不知道应该如何配置多路径的mutipath.conf文件的;而凭借肉眼手工去对应磁盘设备的wwid和大…...

Android Framework AMS(10)广播组件分析-1
该系列文章总纲链接:专题总纲目录 Android Framework 总纲 本章关键点总结 & 说明: 说明:本章节主要解读应用层广播组件的发送广播和接收处理广播 2个过程,以及从APP层到AMS调用之间的打通。关注思维导图中左上部分即可。 有…...
在 Node.js 中使用 .env 文件
什么是 .env 文件? 文件.env是包含环境变量键值对的简单文本文件。此文件的内容不会被签入源代码管理,从而确保敏感数据的安全。 示例 PORT 4000 DATABASE_URL mongodb://localhost: 27017 /mydb API_KEY abcd1234 NODE_ENV development 在 Node.…...
CesiumJS 案例 P19:添加矩形、监听鼠标左击、监听鼠标右击、监听鼠标移动
CesiumJS CesiumJS API:https://cesium.com/learn/cesiumjs/ref-doc/index.html CesiumJS 是一个开源的 JavaScript 库,它用于在网页中创建和控制 3D 地球仪(地图) 一、添加矩形 <!DOCTYPE html> <html lang"en&…...

路测毫米波雷达标定和目标跟踪
1 2 3 4 5 6 查找匹配时,先对数据排序。逐帧对数据处理,运行速度快。单帧有噪点,多帧处理,准确率更高一些。 7 8 9 10 参考 路侧毫米波雷达标定与目标跟踪哔哔哩_bilibili路侧毫米波雷达标定与目标跟踪, 视频播放量 5855、弹幕量…...
【sqlmap使用手册-持续更新中】
SQLMap 简介 SQLMap 是一个开源的渗透测试工具,用于自动化检测和利用 SQL 注入漏洞。它支持多种数据库,包括 MySQL、PostgreSQL、Oracle、SQL Server 等。 可以通过以下命令安装sqlmap git clone https://github.com/sqlmapproject/sqlmap.git最常用的…...

面向对象三大特征之一:封 装
1、特点 封装是面向对象的核心思想,两层含义:一是一个整体(把对象的属性和行为看成一个整体,即封装在一个对象种),二是信息隐藏,对外隐藏,但可以通过某种方式进行调用。 2、访问权…...

qt QMenuBar详解
1、概述 QMenuBar是Qt框架中用于创建菜单栏的类,它继承自QWidget。QMenuBar通常位于QMainWindow对象的标题栏下方,用于组织和管理多个QMenu(菜单)和QAction(动作)。菜单栏提供了一个水平排列的容器&#x…...

ESP32的下的蓝牙应用笔记(1)——Beacon蓝牙信标
Beacon蓝牙信标简介 Beacon蓝牙信标是一种基于蓝牙低功耗(BLE)技术的设备,主要用于提供位置信息和数据传输服务。它通过周期性地广播信号,能够在一定范围内与其他蓝牙设备进行通信,从而提供精准的位置信息和相关服…...

控制台安全内部:创新如何塑造未来的硬件保护
在 Help Net Security 的采访中,安全研究人员 Specter 和 ChendoChap 讨论了游戏机独特的安全模型,并强调了它与其他消费设备的不同之处。 他们还分享了对游戏机安全性的进步将如何影响未来消费者和企业硬件设计的看法。 斯佩克特 (Specter) 是本周在阿…...

如何选择适合自己的 Python IDE
集成开发环境(IDE)是指提供广泛软件开发能力的软件应用程序。IDE 通常包括源代码编辑器、构建自动化工具和调试器。大多数现代 IDE 都配备了智能代码补全功能。在本文中,你将发现目前市场上最好的 Python IDE。 什么是 IDE? IDE…...

Matlab车牌识别课程设计报告模板(附源代码)
目 录 一.课程设计目的……………………………………………3 二.设计原理…………………………………………………3 三.详细设计步骤……………………………………………3 四. 设计结果及分析…………………………………………18 五. …...
kubesphere jenkins自动重定向 http://ks-apiserver:30880/oauth/authorize
问题:登陆kubesphere的jenkins Nodeport IP :Port 46.XXX.XXX.16:30180 自动跳转失败 http://ks-apiserver:30880/oauth/authorize?client_idjenkins&redirect_urihttp://46.XXX.XXX.16:30180/securityRealm/finishLogin&response_typecode&scopeopen…...
Vue3访问页面时自动获取数据
1. 使用生命周期钩子函数 # 后端代码--使用pywebview class Api:def greet(self):greet_text pywebview and vue3response {}response[text] greet_textreturn responseif __name__ __main__:# 前后端通信测试api Api()window webview.create_window(Vue app in pywebvie…...
go语言回调函数的使用
前言 在 Go 语言中,回调函数是一种将一个函数作为参数传递给另一个函数,在特定的事件发生时被调用的编程模式。 一、回调函数的定义 type OnTaskHandler func(r []byte)type remoteTaskClient struct {sync.RWMutexonTask OnTaskHandler } 以上定义了…...
区块链学习笔记(一)
区块链技术实现了去中心化的货币系统,与中心化记账方式不同,它消除了中间第三方,允许用户进行点对点交易,并确保了货币的真正所有权。此外,区块链的代码完全公开且不可篡改,保障了系统的透明度和安全性。 …...
解决QT打包发布App Store时(90238)错误
Invalid signature. The main app bundle, xxxx at the “xxxx.app” path, has the following signing error(s): [a sealed resource is missing or invalid. In subcomponent: xxxx.app/Contents/Frameworks/QtWebEngineCore.framework]. For details about signing Mac cod…...

使用Vite构建现代化前端应用
💓 博客主页:瑕疵的CSDN主页 📝 Gitee主页:瑕疵的gitee主页 ⏩ 文章专栏:《热点资讯》 使用Vite构建现代化前端应用 引言 Vite 简介 安装 Vite 创建项目 启动开发服务器 项目结构 配置 Vite 开发模式 生产构建 使用插…...
PyQt入门指南三十八 QWizard向导组件
在PyQt中,QWizard 是一个用于创建向导式应用程序的组件。向导是一种用户界面模式,它通过一系列逐步的页面引导用户完成某个任务。每个页面通常包含一些输入字段和选项,用户需要在每个页面上完成相应的操作,然后才能进入下一个页面…...

Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Java多线程实现之Thread类深度解析
Java多线程实现之Thread类深度解析 一、多线程基础概念1.1 什么是线程1.2 多线程的优势1.3 Java多线程模型 二、Thread类的基本结构与构造函数2.1 Thread类的继承关系2.2 构造函数 三、创建和启动线程3.1 继承Thread类创建线程3.2 实现Runnable接口创建线程 四、Thread类的核心…...
今日学习:Spring线程池|并发修改异常|链路丢失|登录续期|VIP过期策略|数值类缓存
文章目录 优雅版线程池ThreadPoolTaskExecutor和ThreadPoolTaskExecutor的装饰器并发修改异常并发修改异常简介实现机制设计原因及意义 使用线程池造成的链路丢失问题线程池导致的链路丢失问题发生原因 常见解决方法更好的解决方法设计精妙之处 登录续期登录续期常见实现方式特…...

学校时钟系统,标准考场时钟系统,AI亮相2025高考,赛思时钟系统为教育公平筑起“精准防线”
2025年#高考 将在近日拉开帷幕,#AI 监考一度冲上热搜。当AI深度融入高考,#时间同步 不再是辅助功能,而是决定AI监考系统成败的“生命线”。 AI亮相2025高考,40种异常行为0.5秒精准识别 2025年高考即将拉开帷幕,江西、…...

视频行为标注工具BehaviLabel(源码+使用介绍+Windows.Exe版本)
前言: 最近在做行为检测相关的模型,用的是时空图卷积网络(STGCN),但原有kinetic-400数据集数据质量较低,需要进行细粒度的标注,同时粗略搜了下已有开源工具基本都集中于图像分割这块,…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】
大家好,我是java1234_小锋老师,看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】,分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

Linux中《基础IO》详细介绍
目录 理解"文件"狭义理解广义理解文件操作的归类认知系统角度文件类别 回顾C文件接口打开文件写文件读文件稍作修改,实现简单cat命令 输出信息到显示器,你有哪些方法stdin & stdout & stderr打开文件的方式 系统⽂件I/O⼀种传递标志位…...
Python学习(8) ----- Python的类与对象
Python 中的类(Class)与对象(Object)是面向对象编程(OOP)的核心。我们可以通过“类是模板,对象是实例”来理解它们的关系。 🧱 一句话理解: 类就像“图纸”,对…...
从实验室到产业:IndexTTS 在六大核心场景的落地实践
一、内容创作:重构数字内容生产范式 在短视频创作领域,IndexTTS 的语音克隆技术彻底改变了配音流程。B 站 UP 主通过 5 秒参考音频即可克隆出郭老师音色,生成的 “各位吴彦祖们大家好” 语音相似度达 97%,单条视频播放量突破百万…...

react菜单,动态绑定点击事件,菜单分离出去单独的js文件,Ant框架
1、菜单文件treeTop.js // 顶部菜单 import { AppstoreOutlined, SettingOutlined } from ant-design/icons; // 定义菜单项数据 const treeTop [{label: Docker管理,key: 1,icon: <AppstoreOutlined />,url:"/docker/index"},{label: 权限管理,key: 2,icon:…...