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

PHP MySQL 擴展函數速查表:從 mysql_* 到 mysqli/PDO 遷移指南

     編輯:PHP 相關知識

重要提示:mysql_* 系列函數自 **PHP 5.5 棄用、PHP 7.0 移除**。所有新專案**必須**使用 mysqli 或 PDO。本文整理舊函數對應關係,助力遷移重構。

核心函數對照表

舊 mysql_* 函數mysqli 面向過程mysqli 面向對象PDO
mysql_connect()mysqli_connect()new mysqli()new PDO()
mysql_pconnect()mysqli_pconnect()new mysqli(..., MYSQLI_CLIENT_PERSISTENT)PDO::ATTR_PERSISTENT => true
mysql_select_db()mysqli_select_db()$mysqli->select_db()DSN 指定 dbname
mysql_query()mysqli_query()$mysqli->query()$pdo->query()/exec()
mysql_fetch_array()mysqli_fetch_array()$result->fetch_array()$stmt->fetch(PDO::FETCH_ASSOC)
mysql_fetch_assoc()mysqli_fetch_assoc()$result->fetch_assoc()$stmt->fetch(PDO::FETCH_ASSOC)
mysql_fetch_row()mysqli_fetch_row()$result->fetch_row()$stmt->fetch(PDO::FETCH_NUM)
mysql_fetch_object()mysqli_fetch_object()$result->fetch_object()$stmt->fetch(PDO::FETCH_OBJ)
mysql_num_rows()mysqli_num_rows()$result->num_rows$stmt->rowCount() (僅 SELECT)
mysql_affected_rows()mysqli_affected_rows()$mysqli->affected_rows$stmt->rowCount() (INSERT/UPDATE/DELETE)
mysql_insert_id()mysqli_insert_id()$mysqli->insert_id$pdo->lastInsertId()
mysql_error()mysqli_error()$mysqli->error$pdo->errorInfo()
mysql_errno()mysqli_errno()$mysqli->errno$pdo->errorCode()
mysql_real_escape_string()mysqli_real_escape_string()$mysqli->real_escape_string()**預處理綁定參數**(無需轉義)
mysql_close()mysqli_close()$mysqli->close()$pdo = null
mysql_free_result()mysqli_free_result()$result->free()$stmt = null
mysql_list_dbs()mysqli_query('SHOW DATABASES')$mysqli->query('SHOW DATABASES')$pdo->query('SHOW DATABASES')
mysql_list_tables()mysqli_query('SHOW TABLES')$mysqli->query('SHOW TABLES')$pdo->query('SHOW TABLES')

關鍵差異與遷移要點

  1. 預處理語句:mysqli/PDO 核心優勢,徹底防 SQL 注入,性能更優。
    // mysqli 預處理
    $stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
    $stmt->bind_param('s', $email);
    $stmt->execute();
    $result = $stmt->get_result();
    while ($row = $result->fetch_assoc()) { ... }
    
    // PDO 預處理
    $stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
    $stmt->execute([':email' => $email]);
    while ($row = $stmt->fetch()) { ... }
    
  2. 錯誤處理模式:mysqli 預設返回 false,建議啟用異常模式 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);PDO 預設靜默,建議 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)。
  3. 事務控制:
    // mysqli
    $mysqli->begin_transaction();
    try { $mysqli->commit(); } catch { $mysqli->rollback(); }
    
    // PDO
    $pdo->beginTransaction();
    try { $pdo->commit(); } catch { $pdo->rollBack(); }
    
  4. 多語句執行:mysqli_multi_query() 需配合 next_result() 遍歷結果集;PDO 不支援多語句(安全考量)。

推薦遷移策略

  1. 新代碼**直接寫 PDO**(支援多種數據庫、命名參數、異常模式統一)。
  2. 舊代碼逐模塊重構:先抽象 Database 介面,再替換底層實現。
  3. 全局搜索 mysql_ 確認零殘留再上線。
  4. 啟用靜態分析工具(Psalm、PHPStan)捕獲遺漏調用。

摒棄 mysql_*,擁抱預處理與現代異常處理,是 PHP 專案安全、可維護的基石。

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