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>
<?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; -- 正常查詢自動排除
優點:資料可回溯、避免外鍵約束問題、支援「回收站」功能。
| 錯誤寫法 | 問題 | 正確寫法 |
|---|---|---|
DELETE * FROM ... | 語法錯誤,DELETE 後無 * | DELETE FROM ... |
直接拼接 $_POST['id'] | SQL 注入風險 | 預處理 ? 佔位符 |
| 批次刪除循環執行單條 SQL | 效能差、無事務保護 | 單條 IN (...) + 事務 |
無 WHERE 子句 | 清空整張表 | 永遠加條件,或用 TRUNCATE 重置 |
遵循最佳實踐,讓刪除操作既安全又高效。