在 PHP 開發中,頻繁需要檢查資料庫某條記錄是否存在。許多初學者習慣先查詢再判斷行數,但這存在效率與安全性隱患。本文提供現代化的最佳實踐方案。
<?php
$sql = "SELECT * FROM checklist WHERE game_id=$gid AND task='$task' AND status='$status'";
$result = mysql_query($sql);
$row = mysql_fetch_array($result, MYSQL_ASSOC);
if (!mysql_num_rows($result)) {
echo "record doesn't exist~~~~~!!!!!!";
} else {
echo $row['game_id'];
echo $row['task'];
}
?>
缺點: 使用已棄用的 mysql_* 函數;直接拼接變數導致 SQL 注入風險;查詢所有欄位浪費資源。
<?php
$pdo = new PDO("mysql:host=localhost;dbname=test", "user", "pass");
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$sql = "SELECT 1 FROM checklist WHERE game_id = :gid AND task = :task AND status = :status LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute([
':gid' => $gid,
':task' => $task,
':status' => $status
]);
if ($stmt->fetchColumn()) {
echo "記錄存在";
} else {
echo "記錄不存在";
}
?>
SELECT 1 配合 LIMIT 1,僅判斷存在性,不傳輸多餘數據<?php
function recordExists(PDO $pdo, string $table, array $conditions): bool
{
$where = [];
$params = [];
foreach ($conditions as $col => $val) {
$where[] = "`$col` = :$col";
$params[":$col"] = $val;
}
$sql = "SELECT 1 FROM `$table` WHERE " . implode(' AND ', $where) . " LIMIT 1";
$stmt = $pdo->prepare($sql);
$stmt->execute($params);
return (bool)$stmt->fetchColumn();
}
// 使用範例
$exists = recordExists($pdo, 'checklist', [
'game_id' => $gid,
'task' => $task,
'status' => $status
]);
?>
拋棄舊式 mysql_* 函數,改用 PDO 預處理語句,配合 SELECT 1 ... LIMIT 1 模式,即能安全、高效地判斷記錄是否存在。建議在專案中封裝通用工具函數,提升開發效率與代碼品質。