首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

ThinkPHP 批量删除实现:前端复选框 + 后端 IN 查询最佳实践

     編輯:PHP 綜合知識

核心原理

HTML 表单中同名 name="ids[]" 的复选框提交时,PHP 自动接收为数组 $_POST['ids'] = [1, 5, 8]。后端用主键 IN 条件一次性删除。

前端模板 (ThinkPHP 6/5 模板语法)

<table class="table table-striped">
    <thead>
        <tr>
            <th style="width: 40px">
                <input type="checkbox" class="check-all">
            </th>
            <th>ID</th>
            <th>标题</th>
            <th>操作</th>
        </tr>
    </thead>
    <tbody>
        <volist name="list" id="vo">
        <tr>
            <td><input type="checkbox" name="ids[]" value="{$vo.id}" class="check-item"></td>
            <td>{$vo.id}</td>
            <td>{$vo.title}</td>
            <td>
                <a href="{:url('edit', ['id' => $vo.id])}">编辑</a>
                <a href="javascript:;" class="btn-delete" data-id="{$vo.id}">删除</a>
            </td>
        </tr>
        </volist>
    </tbody>
</table>

<div class="batch-actions">
    <button type="button" id="btn-batch-delete" class="btn btn-danger">
        <i class="fa fa-trash"></i> 批量删除选中
    </button>
</div>

<script>
// 全选/反选
$('.check-all').change(function() {
    $('.check-item').prop('checked', this.checked);
});

// 批量删除 AJAX
$('#btn-batch-delete').click(function() {
    const ids = $('.check-item:checked').map(function() { return this.value; }).get();
    if (!ids.length) {
        layer.msg('请至少选择一项', {icon: 2});
        return;
    }
    layer.confirm('确定删除选中的 ' + ids.length + ' 条记录?', {icon: 3}, function(index) {
        $.post('{:url("batchDelete")}', {ids: ids.join(",")}, function(res) {
            if (res.code === 1) {
                layer.msg(res.msg, {icon: 1}, function() { location.reload(); });
            } else {
                layer.msg(res.msg, {icon: 2});
            }
        }, 'json');
        layer.close(index);
    });
});
</script>

后端控制器 (ThinkPHP 6.0+)

<?php
namespace app\admin\controller;

use think\facade\Db;
use think\facade\Request;

class Article extends BaseController
{
    // 批量删除
    public function batchDelete()
    {
        $ids = Request::param('ids');
        if (empty($ids)) {
            return json(['code' => 0, 'msg' => '参数为空']);
        }

        // 安全过滤:仅允许数字
        $idArr = array_filter(explode(',', $ids), 'ctype_digit');
        if (empty($idArr)) {
            return json(['code' => 0, 'msg' => '无效ID']);
        }

        // 获取主键名 (兼容无主键表)
        $pk = Db::name('article')->getPk();
        if (!$pk) {
            return json(['code' => 0, 'msg' => '表无主键']);
        }

        try {
            $count = Db::name('article')
                ->where($pk, 'in', $idArr)
                ->delete();

            return json([
                'code' => 1,
                'msg' => "成功删除 {$count} 条记录",
                'data' => ['deleted' => $count]
            ]);
        } catch (\Exception $e) {
            \think\facade\Log::error('批量删除失败', ['ids' => $ids, 'error' => $e->getMessage()]);
            return json(['code' => 0, 'msg' => '删除失败:' . $e->getMessage()]);
        }
    }

    // 单条删除 (复用)
    public function delete($id)
    {
        return $this->batchDelete(); // 复用逻辑,前端传 ids=id
    }
}

关键安全加固

  1. 权限校验:在 `BaseController` 中间件或 `_initialize()` 检查 `auth->check('article/delete')`
  2. 软删除:表加 `delete_time` 字段,模型开启 `$useSoftDelete = true`,批量删除自动变软删
  3. 事务保护:涉及关联表删除时用 `Db::transaction()` 包裹
  4. 防 CSRF:AJAX 请求头携带 `X-CSRF-TOKEN`,ThinkPHP 自动验证
  5. 审计日志:记录操作人、IP、ID 列表、时间

ThinkPHP 5.1 兼容写法

public function batchDelete()
{
    $ids = input('param.ids');
    $idArr = array_filter(explode(',', $ids), 'ctype_digit');
    // ...
    $count = db('article')->where('id', 'in', $idArr)->delete();
    // ...
}

进阶:支持树形结构级联删除

若分类表采用嵌套集合模型 (lft/rgt),批量删除需级联子节点:

public function batchDeleteCategory()
{
    $ids = array_filter(explode(',', input('ids')), 'ctype_digit');
    $categories = db('category')->where('id', 'in', $ids)->select();

    Db::transaction(function () use ($categories) {
        foreach ($categories as $cat) {
            // 删除子树
            db('category')
                ->where('lft', '>=', $cat['lft'])
                ->where('rgt', '<=', $cat['rgt'])
                ->delete();
        }
    });
    return json(['code' => 1, 'msg' => '删除成功']);
}

结语

ThinkPHP 批量删除核心是 name="ids[]" + whereIn。生产环境必须叠加:权限控制、软删除、事务、日志审计、CSRF 防护。前端用 Layer/SweetAlert 交互确认,后端统一 JSON 响应,体验与安全兼得。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved