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

PHP + MySQL 員工資料刪除:單筆與批次操作完整範例

     編輯:PHP 綜合知識

資料庫準備

CREATE TABLE `employee` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(30) NOT NULL,
  `age` tinyint(3) unsigned NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

INSERT INTO `employee` (`name`, `age`) VALUES
('張三', 25), ('李四', 28), ('王五', 30), ('趙六', 22);

單筆刪除:預處理語句防注入

<?php
$pdo = new PDO('mysql:host=localhost;dbname=test;charset=utf8mb4', 'root', '');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$id = $_POST['id'] ?? 0;
if ($id > 0) {
    $stmt = $pdo->prepare('DELETE FROM employee WHERE id = ?');
    $stmt->execute([$id]);
    echo "已刪除 $id 號員工(影響行數: {$stmt->rowCount()})";
} else {
    echo '無效 ID';
}

// 顯示剩餘員工
$emps = $pdo->query('SELECT * FROM employee')->fetchAll(PDO::FETCH_ASSOC);
?>
<table border="1" cellpadding="5">
<tr><th>ID</th><th>姓名</th><th>年齡</th></tr>
<?php foreach ($emps as $e): ?>
<tr>
    <td><?= $e['id'] ?></td>
    <td><?= htmlspecialchars($e['name']) ?></td>
    <td><?= $e['age'] ?></td>
</tr>
<?php endforeach; ?>
</table>
<form method="post">
    輸入員工 ID:<input type="number" name="id" min="1" required>
    <button type="submit">刪除</button>
</form>

批次刪除:IN 子句 + 事務

<?php
$ids = $_POST['ids'] ?? []; // 期望陣列 [1,3,4]
$ids = array_filter(array_map('intval', (array)$ids));

if ($ids) {
    $placeholders = implode(',', array_fill(0, count($ids), '?'));
    $sql = "DELETE FROM employee WHERE id IN ($placeholders)";

    $pdo->beginTransaction();
    try {
        $stmt = $pdo->prepare($sql);
        $stmt->execute($ids);
        $pdo->commit();
        echo "批次刪除成功,共 {$stmt->rowCount()} 筆";
    } catch (Exception $e) {
        $pdo->rollBack();
        echo '刪除失敗:' . $e->getMessage();
    }
}

// 表單:複選框批次選擇
$emps = $pdo->query('SELECT * FROM employee')->fetchAll(PDO::FETCH_ASSOC);
?>
<form method="post">
<table border="1" cellpadding="5">
<tr><th><input type="checkbox" id="checkAll"></th><th>ID</th><th>姓名</th><th>年齡</th></tr>
<?php foreach ($emps as $e): ?>
<tr>
    <td><input type="checkbox" name="ids[]" value="<?= $e['id'] ?>"></td>
    <td><?= $e['id'] ?></td>
    <td><?= htmlspecialchars($e['name']) ?></td>
    <td><?= $e['age'] ?></td>
</tr>
<?php endforeach; ?>
</table>
<button type="submit" onclick="return confirm('確定刪除選取項目?')">批次刪除</button>
</form>
<script>document.getElementById('checkAll').onclick = e => document.querySelectorAll('input[name="ids[]"]').forEach(c => c.checked = e.target.checked);</script>

軟刪除(邏輯刪除)— 推薦生產環境做法

實際專案建議加欄位 deleted_at DATETIME NULL,刪除時只更新時間戳:

ALTER TABLE employee ADD COLUMN deleted_at DATETIME NULL DEFAULT NULL;
UPDATE employee SET deleted_at = NOW() WHERE id IN (1,2);
SELECT * FROM employee WHERE deleted_at IS NULL; -- 正常查詢自動排除

優點:資料可回溯、避免外鍵約束問題、支援「回收站」功能。

安全檢查清單

  • ✅ 使用 PDO 預處理 防 SQL 注入
  • ✅ intval() 強制轉型 ID
  • ✅ 批次刪除用 事務 保證原子性
  • ✅ 前端 confirm() 二次確認
  • ✅ 後端驗證 權限/所有權(如只能刪自己部門員工)
  • ✅ 記錄 操作日誌(誰、何時、刪什麼)

常見錯誤與修正

錯誤寫法問題正確寫法
DELETE * FROM ...語法錯誤,DELETE 後無 *DELETE FROM ...
直接拼接 $_POST['id']SQL 注入風險預處理 ? 佔位符
批次刪除循環執行單條 SQL效能差、無事務保護單條 IN (...) + 事務
無 WHERE 子句清空整張表永遠加條件,或用 TRUNCATE 重置

遵循最佳實踐,讓刪除操作既安全又高效。

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