本文提供傳統 mysql_* 函數時代的 MySQL 基本增刪改查 (CRUD) 範例,包含資料表結構、查詢所有記錄與依 ID 查詢單筆記錄的完整代碼。注意:mysql_* 函數已於 PHP 7.0 移除,新專案請改用 PDO 或 MySQLi。
CREATE TABLE `user` (
`id` INT(5) NOT NULL AUTO_INCREMENT,
`name` VARCHAR(20),
`city` VARCHAR(20),
`postcode` VARCHAR(10),
`address` VARCHAR(100),
`password` VARCHAR(10),
`level` TINYINT(2) DEFAULT 0,
`right` TINYINT(2),
`email` VARCHAR(40),
PRIMARY KEY (`id`),
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
INSERT INTO `user` VALUES
(1, '王友', '北京', '100083', '北京市海澱區學院路', '111', 0, 0, 'wangyou000@263.net'),
(2, '金風', '武漢', '430071', '武漢市武昌區水果湖', '111', 0, 0, 'jinfeng000@263.net'),
(3, '常麗', '襄樊', '441021', '襄樊市襄城區南街', '111', 0, 0, 'changli000@263.net');
<?php
$db = mysql_connect("localhost", "root", "");
mysql_select_db("mysite", $db);
$result = mysql_query("SELECT * FROM `user`", $db);
echo "<table border=1>\n";
echo "<tr><th>ID</th><th>姓名</th><th>城市</th><th>郵編</th><th>住址</th><th>等級</th><th>權限</th><th>郵件</th></tr>\n";
while ($row = mysql_fetch_row($result)) {
printf(
"<tr><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td><td>%s</td></tr>\n",
$row[0], $row[1], $row[2], $row[3], $row[4], $row[6], $row[7], $row[8]
);
}
echo "</table>\n";
mysql_free_result($result);
mysql_close($db);
?>
<?php
$db = mysql_connect("localhost", "root", "");
mysql_select_db("mysite", $db);
if (isset($_GET['id'])) {
$id = intval($_GET['id']); // 強制轉整數,防注入
$result = mysql_query("SELECT * FROM `user` WHERE id = $id", $db);
$row = mysql_fetch_assoc($result);
if ($row) {
printf("<h2>用戶詳細資料</h2>");
printf("ID: %s<br>", $row['id']);
printf("姓名: %s<br>", $row['name']);
printf("城市: %s<br>", $row['city']);
printf("郵編: %s<br>", $row['postcode']);
printf("住址: %s<br>", $row['address']);
printf("等級: %s<br>", $row['level']);
printf("郵件: %s<br>", $row['email']);
printf('<a href="%s">返回列表</a>', $_SERVER['PHP_SELF']);
} else {
echo "查無此用戶";
}
} else {
// 顯示用戶列表連結
$result = mysql_query("SELECT id, name FROM `user`", $db);
echo "<h2>請選擇要查詢的用戶:</h2>";
while ($row = mysql_fetch_assoc($result)) {
printf('%s <a href="%s?id=%s">%s</a><br>',
$row['id'], $_SERVER['PHP_SELF'], $row['id'], $row['name']);
}
}
mysql_close($db);
?>
| 議題 | 舊寫法風險 | 現代修正 |
|---|---|---|
| SQL 注入 | 直接拼接變數 "WHERE id=$id" | 預處理語句 prepare() + 參數綁定 |
| 輸出跳脫 | 直接 printf 變數 | htmlspecialchars() 防 XSS |
| 資料庫擴展 | mysql_* (已移除) | PDO / MySQLi |
| 錯誤處理 | 無檢查 | try-catch / 錯誤模式設定 |
<?php
$pdo = new PDO("mysql:host=localhost;dbname=mysite;charset=utf8", "root", "");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$stmt = $pdo->query("SELECT * FROM `user`");
echo "<table border=1><tr><th>ID</th><th>姓名</th>...</tr>";
foreach ($stmt->fetchAll(PDO::FETCH_ASSOC) as $row) {
echo "<tr>";
foreach ($row as $val) echo "<td>" . htmlspecialchars($val) . "</td>";
echo "</tr>";
}
echo "</table>";
?>
理解傳統寫法有助於維護舊專案,但新開發務必採用 PDO/MySQLi + 預處理語句,確保安全與相容性。