業務流程
- 顯示數據列表,每行附帶「修改」按鈕
- 點擊修改提交表單(含隱藏 ID 欄位)
- 服務端驗證、執行 UPDATE、反饋結果
- 重新查詢顯示最新數據
代碼實現(修正原示例 SQL 錯誤與安全問題)
<?php
// 配置
$host = 'localhost'; $user = 'root'; $pass = 'password'; $db = 'test_db';
$mysqli = new mysqli($host, $user, $pass, $db);
if ($mysqli->connect_errno) { die("連接失敗: " . $mysqli->connect_error); }
$mysqli->set_charset('utf8mb4');
// 處理修改提交
if (isset($_POST['btnModify'], $_POST['id'], $_POST['country'], $_POST['animal'])) {
$id = (int)$_POST['id'];
$country = $mysqli->real_escape_string($_POST['country']);
$animal = $mysqli->real_escape_string($_POST['animal']);
// 修正:UPDATE 必須指定 SET 列 = 值
$sql = "UPDATE symbols SET country = ?, animal = ? WHERE id = ?";
$stmt = $mysqli->prepare($sql);
$stmt->bind_param("ssi", $country, $animal, $id);
$result = $stmt->execute();
echo $result ? "修改成功!" : "修改失敗:" . $stmt->error;
$stmt->close();
}
// 查詢顯示數據
$query = "SELECT id, country, animal FROM symbols";
$result = $mysqli->query($query);
?>
<!DOCTYPE html>
<html><head><meta charset="UTF-8"><title>修改記錄</title></head><body>
<h1>修改記錄</h1>
<table border="1" cellpadding="10">
<tr><th>ID</th><th>國家</th><th>動物</th><th>操作</th></tr>
<?php if ($result && $result->num_rows > 0): while($row = $result->fetch_assoc()): ?>
<form method="post" action="">
<tr>
<td><input type="text" name="id" value="<?= $row['id'] ?>" readonly /></td>
<td><input type="text" name="country" value="<?= htmlspecialchars($row['country']) ?>" /></td>
<td><input type="text" name="animal" value="<?= htmlspecialchars($row['animal']) ?>" /></td>
<td><input type="submit" name="btnModify" value="修改" /></td>
</tr>
</form>
<?php endwhile; endif; ?>
</table>
<?php $mysqli->close(); ?>
</body></html>
關鍵修正點
- SQL 語法: 原示例
UPDATE animal SET WHERE ... 缺少 SET column = value,已修正。
- 預處理語句: 使用
prepare() + bind_param() 徹底防注入。
- ID 類型轉換:
(int)$_POST['id'] 確保整型,防異常輸入。
- 輸出轉義:
htmlspecialchars() 防 XSS。
- 表單結構: 每行獨立
<form>,避免隱藏字段衝突。
進階建議
- 採用 PRG 模式:POST 成功後
header("Location: " . $_SERVER['PHP_SELF']) 重定向,防重複提交。
- 引入 CSRF Token 驗證。
- 使用事務處理多表關聯更新。
- 前端引入驗證庫(如 Validator.js)提升體驗。