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

PHP 判斷資料庫記錄是否存在的正確姿勢:從 mysql_* 到 PDO 的演進

     編輯:PHP 相關知識

PHP 判斷資料庫記錄是否存在的正確姿勢:從 mysql_* 到 PDO 的演進

判斷資料庫中記錄是否存在是 Web 開發的高頻操作。本文從歷史代碼重構角度,對比不同時代的實現方式,推薦現代最佳實踐。

歷史代碼分析(不推薦)

<?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_* 擴展(PHP 7.0+ 完全移除)
  • ❌ 直接拼接變數導致 SQL 注入風險
  • ❌ SELECT * 浪費頻寬與記憶體
  • ❌ 無預處理機制,效能低下

現代最佳實踐:PDO + 預處理語句

<?php
// 建議:建立資料庫連線單例或使用依賴注入
$pdo = new PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,  // 使用真實預處理
]);

function recordExists(PDO $pdo, int $gameId, string $task, string $status): bool {
    $sql = "SELECT 1 FROM checklist WHERE game_id = ? AND task = ? AND status = ? LIMIT 1";
    $stmt = $pdo->prepare($sql);
    $stmt->execute([$gameId, $task, $status]);
    return $stmt->fetchColumn() !== false;
}

// 使用示例
if (recordExists($pdo, $gid, $task, $status)) {
    // 記錄存在,執行業務邏輯
} else {
    // 記錄不存在
}

進階優化策略

場景推薦寫法說明
僅需判斷存在性SELECT 1 ... LIMIT 1避免傳輸完整行數據,極致效能
後續需使用數據SELECT id, col1, col2 ... LIMIT 1按需選列,避免 SELECT *
高併發檢查添加唯一索引 + INSERT IGNORE / ON DUPLICATE KEY資料庫層面保證原子性
大量批量檢查WHERE (col1, col2) IN ((?,?),...)單次查詢完成批量判斷

常見誤區辨析

  • 誤區:mysql_num_rows() 或 PDOStatement::rowCount() 可靠
    真相:SELECT 語句的 rowCount 在部分驅動中不可靠,應用 fetchColumn() 或 fetch() 判斷
  • 誤區:COUNT(*) 效能最好
    真相:EXISTS / LIMIT 1 通常更快,尤其有索引時

遷移檢查清單

  1. 將所有 mysql_* 替換為 PDO
  2. 所有動態參數使用預處理佔位符(? 或 :name)
  3. 啟用 PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION
  4. 設置 charset=utf8mb4 確保完整 Unicode 支援
  5. 移除手動 addslashes() 等轉義代碼

採用現代 PDO 寫法不僅修復安全漏洞,更能獲得更好的效能、可維護性與未來相容性。

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