建立一個簡單的水果偏好調查系統,示範 PHP 與 MySQL 完整互動流程:建立資料庫/資料表 → HTML 表單收集資料 → PHP 接收寫入 → 查詢顯示結果。
-- MySQL 指令列
CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
USE mydb;
CREATE TABLE infostar (
id INT UNSIGNED NOT NULL AUTO_INCREMENT PRIMARY KEY,
name VARCHAR(50) NOT NULL,
email VARCHAR(100) NOT NULL,
choice VARCHAR(20) NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>水果偏好調查</title></head>
<body>
<h1>您喜歡吃什麼水果?</h1>
<form method="POST" action="diaocha.php">
<p>姓名:<input name="name" maxlength="50" required></p>
<p>Email:<input name="email" type="email" maxlength="100" required></p>
<p>選擇:
<label><input type="radio" name="choice" value="apple" required> 蘋果</label>
<label><input type="radio" name="choice" value="orange"> 橙子</label>
<label><input type="radio" name="choice" value="pear"> 梨子</label>
<label><input type="radio" name="choice" value="coconut"> 椰子</label>
<label><input type="radio" name="choice" value="watermelon"> 西瓜</label>
<label><input type="radio" name="choice" value="banana"> 香蕉</label>
</p>
<p><input type="submit" value="送出"> <input type="reset" value="重填"></p>
</form>
</body></html>
<?php
// diaocha.php
// 資料庫設定(建議放在獨立 config.php)
$host = 'localhost';
$user = 'root';
$pass = '';
$dbname = 'mydb';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
} catch (PDOException $e) {
die("資料庫連線失敗:" . $e->getMessage());
}
// 接收並驗證輸入
$name = trim($_POST['name'] ?? '');
$email = trim($_POST['email'] ?? '');
$choice = $_POST['choice'] ?? '';
if ($name === '' || $email === '' || $choice === '') {
die("請填寫完整資料。<a href='diaocha.htm'>返回</a>");
}
// 寫入資料庫(Prepared Statement 防 SQL 注入)
$stmt = $pdo->prepare("INSERT INTO infostar (name, email, choice) VALUES (?, ?, ?)");
$stmt->execute([$name, $email, $choice]);
echo "<h2>感謝參與!</h2>";
echo "<p>您好,$name</p>";
echo "<p>Email:$email</p>";
echo "<p>您的選擇:$choice</p>";
echo "<p>資料已儲存。<a href='diaocha.htm'>返回</a></p>";
?>
<?php
// apple.php - 顯示所有選擇蘋果的用戶
$host = 'localhost'; $user = 'root'; $pass = ''; $dbname = 'mydb';
try {
$pdo = new PDO("mysql:host=$host;dbname=$dbname;charset=utf8mb4", $user, $pass, [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
} catch (PDOException $e) {
die("連線失敗:" . $e->getMessage());
}
$stmt = $pdo->prepare("SELECT name, email, created_at FROM infostar WHERE choice = ?");
$stmt->execute(['apple']);
$users = $stmt->fetchAll();
if (empty($users)) {
echo "<p>目前沒有人選擇蘋果。</p>";
} else {
echo "<h2>喜歡蘋果的用戶 (共 " . count($users) . " 人)</h2>";
echo "<ul>";
foreach ($users as $u) {
echo "<li>" . htmlspecialchars($u['name']) . " (" . htmlspecialchars($u['email']) . ") - " . $u['created_at'] . "</li>";
}
echo "</ul>";
}
?>
| 舊式 mysql_* 函式 | 現代 PDO 寫法 | 優勢 |
|---|---|---|
mysql_connect() | new PDO($dsn, $user, $pass) | 支援多種資料庫、例外處理 |
mysql_select_db() | DSN 指定 dbname=... | 連線字串統一管理 |
mysql_query($sql) | $pdo->query($sql) / $pdo->prepare()->execute() | Prepared Statement 防注入 |
mysql_fetch_assoc() | $stmt->fetch() / fetchAll() | 統一介面、支援迭代器 |
mysql_num_rows() | $stmt->rowCount() / count($rows) | 更可靠 |
mysql_insert_id() | $pdo->lastInsertId() | 支援多種序列類型 |
mysql_close() | $pdo = null / 變數超出作用域 | 自動資源管理 |
@mysql_* 抑制錯誤 | try-catch 例外處理 | 結構化錯誤處理 |
trim()、長度限制、格式驗證(email、日期等)。htmlspecialchars() 防 XSS。display_errors,記錄至日誌。LIMIT ?, ?)