本教學示範如何建立一個完整的 HTML 表單,透過 PHP 接收使用者輸入、驗證資料、安全寫入 MySQL 資料庫。涵蓋資料驗證、SQL 注入防護、錯誤處理等實務技巧。
CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `city` VARCHAR(50) NOT NULL, `created_time` DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<?php
// 設定資料庫連線參數
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'admin';
$dbName = 'test';
// 初始化變數
$errors = [];
$success = false;
$name = $city = '';
// 表單送出處理
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
// 1. 取得並清理輸入
$name = trim($_POST['user_name'] ?? '');
$city = trim($_POST['city'] ?? '');
// 2. 伺服器端驗證
if ($name === '') {
$errors[] = '請填寫使用者名稱';
} elseif (mb_strlen($name) > 50) {
$errors[] = '名稱長度不可超過 50 字元';
}
if ($city === '') {
$errors[] = '請選擇城市';
}
// 3. 通過驗證才寫入資料庫
if (empty($errors)) {
try {
// 使用 PDO 預備語句防止 SQL 注入
$pdo = new PDO(
"mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4",
$dbUser,
$dbPass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
$sql = "INSERT INTO users (name, city) VALUES (:name, :city)";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':name' => $name,
':city' => $city
]);
$success = true;
// 重置表單
$name = $city = '';
} catch (PDOException $e) {
$errors[] = '資料寫入失敗:' . $e->getMessage();
}
}
}
?>
<!DOCTYPE html>
<html lang="zh-Hant">
<head>
<meta charset="UTF-8">
<title>使用者資料新增</title>
<style>
.error { color: #dc3545; margin: 10px 0; }
.success { color: #28a745; margin: 10px 0; }
form { max-width: 400px; margin: 20px auto; }
.form-group { margin-bottom: 15px; }
label { display: block; margin-bottom: 5px; font-weight: bold; }
input, select { width: 100%; padding: 8px; border: 1px solid #ccc; border-radius: 4px; }
button { background: #007bff; color: white; padding: 10px 20px; border: none; border-radius: 4px; cursor: pointer; }
button:hover { background: #0056b3; }
</style>
</head>
<body>
<h2 style="text-align:center;">提交使用者資訊</h2>
<?php if (!empty($errors)): ?>
<div class="error">
<ul><?php foreach ($errors as $err): ?><li><?= htmlspecialchars($err) ?></li><?php endforeach; ?></ul>
</div>
<?php endif; ?>
<?php if ($success): ?>
<div class="success">資料新增成功!</div>
<?php endif; ?>
<form method="post" action="">
<div class="form-group">
<label for="user_name">使用者名稱:</label>
<input type="text" id="user_name" name="user_name" value="<?= htmlspecialchars($name) ?>" required>
</div>
<div class="form-group">
<label for="city">來自城市:</label>
<select id="city" name="city" required>
<option value="">-- 請選擇 --</option>
<option value="beijing" <?= $city==='beijing'?'selected':'' ?>>北京</option>
<option value="london" <?= $city==='london'?'selected':'' ?>>倫敦</option>
<option value="newyork" <?= $city==='newyork'?'selected':'' ?>>紐約</option>
<option value="paris" <?= $city==='paris'?'selected':'' ?>>巴黎</option>
<option value="rome" <?= $city==='rome'?'selected':'' ?>>羅馬</option>
</select>
</div>
<button type="submit">提交</button>
</form>
</body>
</html>
PDO::prepare() 與參數綁定,徹底防止 SQL 注入htmlspecialchars() 防止 XSS 攻擊這個範例展示了從表單設計、資料驗證、安全寫入到使用者回饋的完整流程。掌握這些基礎概念,是建立安全可靠 PHP 應用程式的關鍵。