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

PHP操作MySQL核心API速查:mysqli/PDO函數大全與最佳實踐模式

     編輯:MySQL 綜合教學

現代 PHP 只認兩套 API

  • mysqli:MySQL 專用、雙模式(過程/物件)、預處理、多查詢、異步
  • PDO:跨數據庫抽象、命名參數、統一異常、**新項目首選**

棄用:mysql_*(PHP 7.0 移除)、mysql_connect、mysql_query 等古老函數。

PDO 核心 API 速查表(推薦收藏)

分類方法/屬性用途關鍵參數/返回值
連接new PDO($dsn, $user, $pass, $options)建立連接DSN: mysql:host=...;dbname=...;charset=utf8mb4
setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)異常模式(必開)拋出 PDOException
setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC)默認獲取模式FETCH_ASSOC/NUM/BOTH/OBJ/CLASS
setAttribute(PDO::ATTR_EMULATE_PREPARES, false)真實預處理防注入核心,關閉模擬
預處理執行prepare($sql)創建預處理語句返回 PDOStatement
execute($params = [])綁定參數並執行數組綁定:[':name' => $val] 或 [$val1, $val2]
bindParam($param, &$var, $type)引用綁定(循環優勢)類型:PARAM_STR/INT/BOOL/NULL/LOB
bindValue($param, $value, $type)值綁定立即求值
rowCount()影響行數(INSERT/UPDATE/DELETE)SELECT 不可靠,勿用於判斷結果集
結果集獲取fetch($mode = FETCH_ASSOC)單行獲取返回數組/對象/false
fetchAll($mode)全量獲取大結果集慎用,記憶體風險
fetchColumn($col = 0)單列值聚合查詢常用
fetchObject($class = 'stdClass')映射對象支持自定義類構造函數
setFetchMode(PDO::FETCH_CLASS, 'User')設置映射類屬性自動映射
getColumnMeta($index)列元數據名稱、類型、長度、標志
事務控制beginTransaction()開啟事務需 InnoDB,DDL 會隱式提交
commit()提交
rollBack()回滾
屬性/信息lastInsertId($seq = null)自增 IDPostgreSQL 需指定序列名
errorCode() / errorInfo()錯誤代碼/詳情非異常模式下使用
getAttribute(PDO::ATTR_CONNECTION_STATUS)連接狀態長連接心跳檢查

mysqli 物件風格核心 API 對照

操作mysqli 方法PDO 對應
連接new mysqli($host, $user, $pass, $db, $port)new PDO(...)
字符集set_charset('utf8mb4')DSN charset=utf8mb4
預處理prepare($sql) → bind_param('ssi', ...) → execute()prepare() → execute([...])
查詢query($sql) 返回 mysqli_resultquery($sql) 返回 PDOStatement
遍歷結果fetch_assoc() / fetch_array() / fetch_object()fetch(PDO::FETCH_ASSOC) 等
釋放結果free()null / 變量銷毀
事務begin_transaction() / commit() / rollback()同名方法
自增 IDinsert_idlastInsertId()
影響行數affected_rowsrowCount()
錯誤errno / errorerrorCode() / errorInfo()
關閉close()$pdo = null

高頻實用代碼片段(PDO 版)

// 1. 安全配置模板
$pdo = new PDO(
    'mysql:host=127.0.0.1;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,
        PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8mb4",
    ]
);

// 2. 批量插入(單條預處理循環 vs 多值語句)
// 方案 A: 預處理循環(事務包裹,穩健)
$pdo->beginTransaction();
$stmt = $pdo->prepare("INSERT INTO logs (level, message) VALUES (?, ?)");
foreach ($logs as $log) {
    $stmt->execute([$log['level'], $log['message']]);
}
$pdo->commit();

// 方案 B: 多值語句(性能極致,需注意 max_allowed_packet)
$values = []; $params = [];
foreach ($logs as $log) {
    $values[] = '(?, ?)';
    $params[] = $log['level'];
    $params[] = $log['message'];
}
$pdo->execute("INSERT INTO logs (level, message) VALUES " . implode(',', $values), $params);

// 3. 分頁查詢(游標優化大偏移)
$stmt = $pdo->prepare("SELECT * FROM posts WHERE id > ? ORDER BY id LIMIT ?");
$stmt->execute([$lastSeenId, $pageSize]);

// 4. 僅獲取首行首列(聚合/計數)
$count = $pdo->query("SELECT COUNT(*) FROM users")->fetchColumn();

// 5. 映射到領域對象
class User { public $id; public $name; public $email; }
$stmt = $pdo->query("SELECT id, username AS name, email FROM users");
$stmt->setFetchMode(PDO::FETCH_CLASS, 'User');
$users = $stmt->fetchAll();  // User[] 對象數組

// 6. 異常處理統一入口
try {
    // DB 操作
} catch (PDOException $e) {
    error_log(sprintf('[%s] SQLSTATE[%s] %s', date('c'), $e->getCode(), $e->getMessage()));
    // 業務層轉換為統一異常或返回錯誤碼
}

字符集/編碼鐵律(防亂碼)

  1. 數據庫/表/列:CHARSET utf8mb4 COLLATE utf8mb4_general_ci
  2. DSN:charset=utf8mb4
  3. 連接後:SET NAMES utf8mb4(PDO MYSQL_ATTR_INIT_COMMAND 自動執行)
  4. PHP 腳本文件:UTF-8 無 BOM 保存
  5. HTML 輸出:header('Content-Type: text/html; charset=utf-8') 或 <meta charset="utf-8">

總結

PHP 操作 MySQL 的**專業標準**是:**PDO + 真實預處理 + 異常模式 + utf8mb4 全鏈路 + 單例連接 + 統一異常處理**。本文提供的 API 速查表與代碼片段覆蓋 95% 日常開發場景。建議將 Database 類封裝為項目基礎設施,禁止在業務代碼中直接裸露 PDO 操作,**Repository 模式**封裝 SQL 細節,才是可維護架構的起點。

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