在后台管理中,PHP分页展示数据非常常见,但用户往往希望跨页勾选多条记录后一次性处理。要实现这种批量操作,核心思路是前端的选中状态不能随翻页丢失,后端则根据提交的ID集合执行相应SQL。

一、前端分页与批量选择
通常使用复选框让用户选择数据,每一行对应一个数据的ID。为了在翻页后仍然记住之前选中的项,可以用JavaScript把选中ID存入一个数组,并放在隐藏域里随表单提交。
<form method="post" action="batch.php">
<input type="hidden" name="selected_ids" id="selected_ids" value="">
<table>
<tr><th>选择</th><th>ID</th><th>名称</th></tr>
<tr>
<td><input type="checkbox" class="row_check" value="1"></td>
<td>1</td><td>测试一</td>
</tr>
<tr>
<td><input type="checkbox" class="row_check" value="2"></td>
<td>2</td><td>测试二</td>
</tr>
</table>
<button type="submit">批量删除</button>
</form>
<script>
var selected = [];
document.querySelectorAll('.row_check').forEach(function(box){
box.onchange = function(){
if(this.checked){
selected.push(this.value);
}else{
selected = selected.filter(function(v){return v != this.value;}, this);
}
document.getElementById('selected_ids').value = selected.join(',');
};
});
</script>
二、PHP分页查询
后端通过LIMIT实现分页,并渲染当前页数据。下面示例根据页码计算偏移量:
<?php
$page = isset($_GET['page']) ? (int)$_GET['page'] : 1;
$page = max($page, 1);
$size = 10;
$offset = ($page - 1) * $size;
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
$sql = "SELECT id, name FROM items LIMIT $offset, $size";
$stmt = $pdo->query($sql);
$list = $stmt->fetchAll(PDO::FETCH_ASSOC);
?>
三、PHP接收批量数据并处理
表单提交后,PHP从selected_ids中拿到逗号分隔的ID,使用预处理防止注入,执行批量删除:
<?php
if($_SERVER['REQUEST_METHOD'] === 'POST'){
$ids = explode(',', $_POST['selected_ids']);
$ids = array_filter($ids, 'is_numeric');
if(count($ids) > 0){
$place = rtrim(str_repeat('?,', count($ids)), ',');
$pdo = new PDO('mysql:host=127.0.0.1;dbname=test', 'root', '');
$sql = "DELETE FROM items WHERE id IN ($place)";
$stmt = $pdo->prepare($sql);
$stmt->execute($ids);
echo "已处理 ".count($ids)." 条记录";
}
}
?>
四、跨页保持选择的改进方案
如果页面刷新或分页用链接跳转,可以用$_SESSION暂存选中ID,或者在JS中使用全局对象存储。关键点在于无论翻到哪一页,隐藏域或会话中的ID集合都是全集,后端只认最终提交的ID列表。
| 方式 | 优点 | 缺点 |
|---|---|---|
| 隐藏域+JS数组 | 实现简单,无需服务端状态 | 用户清空表单会丢失 |
| Session存储 | 刷新不丢失,适合多步操作 | 占用服务端内存 |
小结
PHP分页批量操作并不复杂,重点是把选中状态从单页扩展到多页,并在后端用预处理语句安全执行。按照上述结构,你可以快速为任意列表加上批量处理能力。