首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 連接 MySQL 三大方式全解析:mysql、mysqli、PDO

     編輯:MySQL 資料庫相關知識

方式一:傳統 mysql 擴展(已棄用)

⚠️ 警告:PHP 5.5.0 棄用,PHP 7.0.0 移除。僅供維護老項目參考。

基本流程

$con = mysql_connect($host, $user, $pass) or die("連接失敗: " . mysql_error());
mysql_select_db($dbname, $con);

// 執行查詢
$qres = mysql_query("SELECT id, GoodsName FROM user");

// 獲取結果集三種方式對比
// 1. mysql_fetch_row() - 數值索引數組
$row = mysql_fetch_row($qres);  // [0 => '1', 1 => '商品A']

// 2. mysql_fetch_assoc() - 關聯索引數組
$row = mysql_fetch_assoc($qres);  // ['id' => '1', 'GoodsName' => '商品A']

// 3. mysql_fetch_array() - 雙模式(默認 MYSQL_BOTH)
$row = mysql_fetch_array($qres);  // 同時包含數值和關聯索引

// 遍歷所有行
$reslist = [];
while ($row = mysql_fetch_assoc($qres)) {
    $reslist[] = $row;
}

mysql_close($con);

錯誤處理技巧

// @ 抑制系統錯誤,die() 自定義友好提示
$con = @mysql_connect($host, $user, $pass) or die("數據庫連接失敗,請稍後重試");

mysql_query() 返回值規則

  • SELECT/SHOW/DESCRIBE:成功返回資源,失敗返回 FALSE
  • INSERT/UPDATE/DELETE/DROP:成功返回 TRUE,失敗返回 FALSE

方式二:mysqli 擴展(推薦)

MySQL Enhanced,支持面向過程與面向對象雙模式,支持預處理、事務、多語句等高級特性。

面向對象寫法(推薦)

$db = new mysqli($host, $user, $pass, $dbname);

if (mysqli_connect_error()) {
    die('連接失敗: ' . mysqli_connect_error());
}

// 查詢
$result = $db->query("SELECT id, GoodsName FROM user");

// 獲取單行
$row = $result->fetch_assoc();  // 關聯數組
$row = $result->fetch_row();    // 數值數組
$row = $result->fetch_array();  // 雙模式

// 遍歷
while ($row = $result->fetch_assoc()) {
    $data[] = $row;
}

// 釋放結果集
$result->free();

// 預處理語句(防注入、提升性能)
$stmt = $db->prepare("SELECT * FROM user WHERE id = ?");
$stmt->bind_param("i", $id);
$stmt->execute();
$res = $stmt->get_result();
while ($row = $res->fetch_assoc()) { /* ... */ }
$stmt->close();

$db->close();

面向過程寫法

$con = mysqli_connect($host, $user, $pass, $dbname);
$result = mysqli_query($con, "SELECT * FROM user");
$row = mysqli_fetch_assoc($result);
// ... 類似面向對象 API
mysqli_close($con);

方式三:PDO(PHP Data Objects)

數據庫抽象層,統一 API 操作 MySQL、SQLite、PostgreSQL、Oracle 等多種數據庫,僅需更改 DSN(Data Source Name)。

連接配置

// MySQL
$dsn = "mysql:host=$host;dbname=$dbname;charset=utf8mb4";
$dbh = new PDO($dsn, $user, $pass);

// SQLite
$dsn = "sqlite:/path/to/database.db";
$dbh = new PDO($dsn);

// PostgreSQL
$dsn = "pgsql:host=$host;port=5432;dbname=$dbname;user=$user;password=$pass";
$dbh = new PDO($dsn);

通用操作

// 設置錯誤模式為異常(推薦)
$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

// 查詢
$stmt = $dbh->query("SELECT id, name FROM user");
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) {
    $data[] = $row;
}

// 預處理(核心優勢)
$stmt = $dbh->prepare("SELECT * FROM user WHERE id = :id");
$stmt->bindValue(':id', $id, PDO::PARAM_INT);
$stmt->execute();
$rows = $stmt->fetchAll(PDO::FETCH_ASSOC);

// 事務控制
$dbh->beginTransaction();
try {
    $dbh->exec("INSERT ...");
    $dbh->exec("UPDATE ...");
    $dbh->commit();
} catch (Exception $e) {
    $dbh->rollBack();
    throw $e;
}

三大方式綜合對比

特性mysqlmysqliPDO
PHP 版本支持≤ 5.6(已移除)5.0+5.1+
面向對象❌✅✅
預處理語句❌✅✅
多數據庫支持❌ 仅 MySQL❌ 仅 MySQL✅ 12+ 驅動
事務支持❌✅✅
性能基礎優秀優秀(略高開銷)
推薦指數⭐ (禁用)⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

選型建議

  1. 新項目:優先選 mysqli(面向對象) 或 PDO
  2. 多數據庫兼容需求:必選 PDO
  3. 純 MySQL 高性能場景:mysqli 略勝一籌
  4. 老項目維護:儘快遷移至 mysqli/PDO,勿再使用 mysql_* 函數

安全最佳實踐

  • 永遠使用預處理語句防止 SQL 注入
  • 數據庫用戶遵循最小權限原則
  • 生產環境關閉錯誤顯示,記錄錯誤日誌
  • 使用 utf8mb4 字符集完整支持 Emoji
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved