php分页需先用mysqli或pdo连接数据库,再结合limit和offset(或主键范围优化)实现切片;须校验并转义用户输入防sql注入,且总数查询与分页查询where条件必须严格一致。

PHP分页本身不负责连接数据库,它只是对已查出的数据做切片;真正要连数据库,得先用 mysqli 或 PDO 建立连接,再把分页逻辑套在查询上。
怎么写带分页的 SQL 查询(MySQL)
分页核心是 LIMIT 和 OFFSET,但直接拼 OFFSET 在大数据量下会变慢——因为 MySQL 仍要扫描前面所有行。
- 基础写法:
SELECT * FROM users LIMIT 10 OFFSET 20表示跳过前 20 条,取 10 条 - 更高效的做法(尤其偏移量大时):用主键范围代替
OFFSET,比如WHERE id > 12345 LIMIT 10 - 注意:
LIMIT参数必须是整数,不能直接代入用户传的$_GET['page'],否则有 SQL 注入风险 - 推荐先用
intval()或filter_var($page, FILTER_VALIDATE_INT)强制转整型
PHP 里怎么算当前页、总条数和页码范围
分页不是只查数据,还得知道“总共多少页”“当前第几页”,否则没法渲染页码栏。
Difeye是一款超轻量级PHP框架,主要特点有: Difeye是一款超轻量级PHP框架,主要特点有: ◆数据库连接做自动主从读写分离配置,适合单机和分布式站点部署; ◆支持Smarty模板机制,可灵活配置第三方缓存组件; ◆完全分离页面和动作,仿C#页面加载自动执行Page_Load入口函数; ◆支持mysql,mongodb等第三方数据库模块,支持读写分离,分布式部署; ◆增加后台管理开发示例
- 总条数必须单独查一次:
SELECT COUNT(*) FROM users WHERE status = 1(条件要和主查询一致) - 每页条数建议设为常量,比如
$per_page = 15,别硬编码在多处 - 当前页从
$_GET['page']拿,但要兜底:$page = max(1, intval($_GET['page'] ?? 1)) - 起始偏移量是
($page - 1) * $per_page,别漏减 1
用 PDO 还是 mysqli?选哪个更稳
两者都能做分页,但错误处理和参数绑定方式不同,直接影响安全性。
立即学习“PHP免费学习笔记(深入)”;
- 用
PDO更推荐:支持命名占位符,SQL 更清晰,比如WHERE status = :status LIMIT :limit OFFSET :offset -
mysqli要用问号占位符,且bind_param对LIMIT参数不支持(它只接受变量,不接受表达式),所以LIMIT和OFFSET得手动转整型后拼进 SQL - 无论哪种,都别用
mysql_*函数——已彻底废弃,PHP 8 已移除 - 连接失败时,
PDO默认静默,记得设PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
最容易被忽略的是:总数查询和分页查询的 WHERE 条件必须完全一致,否则第一页可能显示 15 条,但总数却算成 100 条——结果最后一页空或错乱。条件逻辑稍一改动,两个查询就得同步改。










