承接前兩篇(查詢列表、新增記錄),本文詳細講解如何實現「編輯現有記錄」與「刪除記錄」功能,重點剖析表單資料流向、隱藏欄位傳遞主鍵、SQL UPDATE/DELETE 語法與安全防護。
編輯/刪除均採用「列表頁 → 處理頁」兩階段:
<?php
$conn = mysqli_connect("localhost", "user", "pass", "example");
$query = "SELECT * FROM tbl";
$result = mysqli_query($conn, $query);
?>
<table>
<tr><th>ID</th><th>姓名</th><th>姓氏</th><th>備註</th><th>操作</th></tr>
<?php while ($row = mysqli_fetch_assoc($result)): ?>
<tr>
<td><?= $row['idx'] ?></td>
<td><?= htmlspecialchars($row['UserName']) ?></td>
<td><?= htmlspecialchars($row['LastName']) ?></td>
<td><?= htmlspecialchars($row['FreeText']) ?></td>
<td>
<a href="edit_form.php?idx=<?= $row['idx'] ?>">編輯</a>
</td>
</tr>
<?php endwhile; ?>
</table>
關鍵點:超連結攜帶主鍵 idx,htmlspecialchars() 防 XSS。
<?php
$idx = $_GET['idx'] ?? '';
$conn = mysqli_connect("localhost", "user", "pass", "example");
$stmt = $conn->prepare("SELECT * FROM tbl WHERE idx = ?");
$stmt->bind_param("i", $idx);
$stmt->execute();
$row = $stmt->get_result()->fetch_assoc();
?>
<form method="post" action="edit_process.php">
<input type="hidden" name="idx" value="<?= $row['idx'] ?>">
<div>姓名: <input type="text" name="UserName" value="<?= htmlspecialchars($row['UserName']) ?>"></div>
<div>姓氏: <input type="text" name="LastName" value="<?= htmlspecialchars($row['LastName']) ?>"></div>
<div>備註: <input type="text" name="FreeText" value="<?= htmlspecialchars($row['FreeText']) ?>"></div>
<button type="submit">更新</button>
</form>
關鍵點:
• 隱藏欄位傳遞主鍵:<input type="hidden" name="idx"> 確保 UPDATE 定位正確記錄
• 預處理語句查詢:防 SQL 注入
• value 預填:表單載入現有值,使用者可直接修改部分欄位
<?php
$idx = $_POST['idx'];
$UserName = $_POST['UserName'];
$LastName = $_POST['LastName'];
$FreeText = $_POST['FreeText'];
$conn = mysqli_connect("localhost", "user", "pass", "example");
$stmt = $conn->prepare("UPDATE tbl SET UserName=?, LastName=?, FreeText=? WHERE idx=?");
$stmt->bind_param("sssi", $UserName, $LastName, $FreeText, $idx);
$stmt->execute();
header("Location: list.php"); // PRG 模式防重複提交
exit;
安全加強:
• 嚴格 WHERE 條件:WHERE idx=? AND UserName=? ... 防並發修改衝突(樂觀鎖思想)
• 輸入驗證:長度、格式、業務規則
• CSRF Token:表單加入 <input type="hidden" name="csrf" value="= $_SESSION['csrf'] ?>">
邏輯同編輯,處理頁執行 DELETE:
<?php
$idx = $_POST['idx'];
$conn = mysqli_connect("localhost", "user", "pass", "example");
$stmt = $conn->prepare("DELETE FROM tbl WHERE idx = ?");
$stmt->bind_param("i", $idx);
$stmt->execute();
header("Location: list.php");
最佳實踐:
• 列表頁「刪除」連結指向確認頁(GET),確認頁表單 POST 到處理頁
• 或使用 JavaScript confirm() 直接 POST(需 CSRF 保護)
• 軟刪除:UPDATE tbl SET deleted_at=NOW() WHERE idx=? 保留歷史
htmlspecialchars(),JS 用 json_encode()header("Location: ...") 重導向,防刷新重複提交mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT) 拋出異常,統一捕獲記錄掌握「列表→表單→處理→重導向」閉環,即具備了 PHP MySQL CRUD 開發的核心骨架。後續可引入框架、ORM、驗證庫、權限系統逐步工程化。