透過 URL 參數 (GET) 從資料庫查詢特定記錄,是動態網頁的基礎應用。本文示範安全的參數處理、資料庫查詢與結果顯示,適用於新聞詳情、使用者檔案、商品頁面等情境。
CREATE TABLE `users` ( `id` INT UNSIGNED NOT NULL AUTO_INCREMENT, `name` VARCHAR(50) NOT NULL, `city` VARCHAR(50) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
<?php
// 資料庫設定
$dbHost = 'localhost';
$dbUser = 'root';
$dbPass = 'admin';
$dbName = 'test';
try {
$pdo = new PDO(
"mysql:host=$dbHost;dbname=$dbName;charset=utf8mb4",
$dbUser,
$dbPass,
[PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION]
);
} catch (PDOException $e) {
die("資料庫連線失敗:" . $e->getMessage());
}
// 1. 取得並驗證參數
$id = filter_input(INPUT_GET, 'id', FILTER_VALIDATE_INT, [
'options' => ['min_range' => 1]
]);
if ($id === false || $id === null) {
die('無效的 ID 參數');
}
// 2. 使用預備語句查詢
$sql = "SELECT id, name, city FROM users WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => $id]);
$user = $stmt->fetch(PDO::FETCH_ASSOC);
// 3. 處理結果
if ($user) {
echo '<pre>';
print_r($user);
echo '</pre>';
} else {
echo '查無此記錄 (ID: ' . htmlspecialchars($id) . ')';
}
// 4. 提供測試連結
echo '<p><a href="?id=2">查詢 ID=2 的記錄</a></p>';
?>
| 技術 | 作用 | 風險若未使用 |
|---|---|---|
filter_input() + FILTER_VALIDATE_INT | 嚴格驗證參數為正整數 | SQL 注入、型別混淆攻擊 |
| PDO 預備語句 | 參數化查詢,資料與程式碼分離 | SQL 注入、資料竄改 |
htmlspecialchars() | 輸出編碼防止 XSS | 跨站腳本攻擊 |
| 例外錯誤模式 | 統一錯誤處理,避免敏感資訊洩露 | 資訊洩露、除錯困難 |
<?php
// 多條件查詢範例
$conditions = [];
$params = [];
if (!empty($_GET['name'])) {
$conditions[] = "name LIKE :name";
$params[':name'] = "%{$_GET['name']}%";
}
if (!empty($_GET['city'])) {
$conditions[] = "city = :city";
$params[':city'] = $_GET['city'];
}
$where = $conditions ? 'WHERE ' . implode(' AND ', $conditions) : '';
$sql = "SELECT * FROM users $where ORDER BY id DESC";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
$users = $stmt->fetchAll(PDO::FETCH_ASSOC);
// 顯示結果...
?>
$_GET['id']:必須經過驗證與過濾透過 URL 參數查詢資料庫是 Web 開發的核心技能。掌握參數驗證、預備語句、錯誤處理三大支柱,能建立安全、穩定的動態查詢功能。建議進一步學習資料庫索引最佳化與查詢快取策略。