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

PHP 批量刪除實戰:從前端複選框到後端預處理語句的安全實現

     編輯:PHP 相關知識

批量刪除是後台管理常見功能,但原文代碼存在 SQL 注入、複選框值缺失、JS 確認邏輯缺失等多重問題。本文給出完整的前後端最佳實踐。

前端:規範的複選框表單

<form action="batch_delete.php" method="post" onsubmit="return confirmDelete()">
    <table>
        <thead><tr><th><input type="checkbox" id="checkAll"></th><th>標題</th></tr></thead>
        <tbody>
            <?php foreach ($newsList as $item): ?>
            <tr>
                <td><input type="checkbox" name="ids[]" value="<?= $item['id'] ?>" class="item-check"></td>
                <td><?= htmlspecialchars($item['title']) ?></td>
            </tr>
            <?php endforeach; ?>
        </tbody>
    </table>
    <button type="submit" name="batch_delete">批量刪除</button>
</form>

<script>
    // 全選/反選
    document.getElementById('checkAll').addEventListener('change', function() {
        document.querySelectorAll('.item-check').forEach(cb => cb.checked = this.checked);
    });
    
    // 提交確認
    function confirmDelete() {
        const checked = document.querySelectorAll('.item-check:checked');
        if (checked.length === 0) {
            alert('請至少選擇一項!');
            return false;
        }
        return confirm(`確定要刪除這 ${checked.length} 條記錄嗎?此操作不可恢復!`);
    }
</script>

後端:PDO 預處理 + 事務 + 驗證

<?php
require_once 'db.php'; // PDO 連接

if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['batch_delete'])) {
    $ids = $_POST['ids'] ?? [];
    
    // 1. 驗證:非空、全數字、去重
    if (empty($ids)) {
        die('未選擇任何記錄');
    }
    $ids = array_unique(array_filter($ids, 'ctype_digit'));
    if (empty($ids)) {
        die('無效的 ID 參數');
    }
    
    // 2. 構建 IN 佔位符
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $sql = "DELETE FROM news WHERE news_id IN ($placeholders)";
    
    try {
        $pdo->beginTransaction();
        $stmt = $pdo->prepare($sql);
        $stmt->execute($ids); // 參數綁定,防注入
        $affected = $stmt->rowCount();
        $pdo->commit();
        
        echo "成功刪除 $affected 條記錄";
        // 建議:重定向回列表頁 header('Location: list.php'); exit;
    } catch (PDOException $e) {
        $pdo->rollBack();
        error_log("Batch delete failed: " . $e->getMessage());
        die('刪除失敗,請稍後重試');
    }
}
?>

原代碼四大問題修復對照

原問題風險修復方案
implode(',', $_POST['chk']) 直接拼接 SQLSQL 注入PDO 預處理 + 參數綁定
複選框無 value 屬性傳值為空字符串<input name="ids[]" value="">
無前端確認,點「取消」也可能提交誤刪JS onsubmit="return confirmDelete()" 攔截
無事務,部分失敗數據不一致數據完整性beginTransaction/commit/rollBack

擴展建議

  • 軟刪除:添加 deleted_at 欄位,批量更新而非物理刪除,支持恢復。
  • 權限控制:檢查當前用戶是否擁有刪除權限(RBAC/策略模式)。
  • 異步處理:大量數據(>1000 條)放入隊列,返回任務 ID,前端輪詢進度。
  • 操作日誌:記錄刪除者、時間、ID 列表、IP,滿足審計需求。

批量刪除看似簡單,安全、體驗、可維護性樣樣不能少。

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