首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

PHP 判斷資料庫記錄是否存在的最佳實踐

     編輯:PHP 綜合知識

問題背景

在 PHP 開發中,頻繁需要檢查資料庫某條記錄是否存在。許多初學者習慣先查詢再判斷行數,但這存在效率與安全性隱患。本文提供現代化的最佳實踐方案。

不推薦的寫法(舊版 mysql_* 函數)

<?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 注入風險;查詢所有欄位浪費資源。

推薦方案:PDO + 預處理語句

<?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 "記錄不存在";
}
?>

核心優勢

  • 安全:預處理語句自動防禦 SQL 注入
  • 高效:SELECT 1 配合 LIMIT 1,僅判斷存在性,不傳輸多餘數據
  • 現代:PDO 是 PHP 官方推薦的資料庫存取層,支援多種資料庫

進階:封裝為通用函數

<?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 模式,即能安全、高效地判斷記錄是否存在。建議在專案中封裝通用工具函數,提升開發效率與代碼品質。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved