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

PHP 連接 MySQL 核心步驟詳解:從 mysql 到 mysqli 再到 PDO 的演進與最佳實踐

     編輯:MySQL 資料庫相關知識

一、 歷史遺留:mysql 擴展(已棄用/移除)

PHP 5.5 棄用,7.0 移除。新項目嚴禁使用。僅作維護老代碼參考:

$link = mysql_connect('localhost', 'root', 'password') or die(mysql_error());
mysql_select_db('dbname', $link);
$result = mysql_query('SELECT * FROM users', $link);
while ($row = mysql_fetch_assoc($result)) { /* ... */ }
mysql_close($link);

二、 現代標準:mysqli 擴展(面向過程 + 面向對象)

1. 面向對象風格(推薦)

$mysqli = new mysqli('localhost', 'root', 'password', 'dbname', 3306);
if ($mysqli->connect_errno) {
    die("Connect failed: {$mysqli->connect_error}");
}
$mysqli->set_charset('utf8mb4');  // 關鍵:設置字符集

// 預處理語句(防注入、性能優)
$stmt = $mysqli->prepare('SELECT id, name FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { /* ... */ }
$stmt->close();
$mysqli->close();

2. 面向過程風格

$link = mysqli_connect('localhost', 'root', 'password', 'dbname', 3306);
mysqli_set_charset($link, 'utf8mb4');
$result = mysqli_query($link, 'SELECT * FROM users');
while ($row = mysqli_fetch_assoc($result)) { /* ... */ }
mysqli_close($link);

三、 企業級首選:PDO (PHP Data Objects)

  • 數據庫無關抽象層,支援 MySQL/PostgreSQL/SQLite 等 12+ 驅動
  • 統一預處理 API、異常模式、事務控制
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8mb4';
$options = [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,  // 真實預處理
];
try {
    $pdo = new PDO($dsn, 'root', 'password', $options);
    $stmt = $pdo->prepare('SELECT id, name FROM users WHERE email = ?');
    $stmt->execute([$email]);
    while ($row = $stmt->fetch()) { /* ... */ }
} catch (PDOException $e) {
    error_log("DB Error: {$e->getMessage()}");
}

四、 核心最佳實踐對比表

維度mysql (舊)mysqliPDO
狀態❌ 移除✅ 維護中✅ 推薦
預處理無支援支援(統一 API)
多數據庫否否是
異常處理無可選原生異常
事務手動 SQLAPIAPI + 嵌套事務
性能基準略優相當

五、 生產環境關鍵配置

  • 字符集:統一 utf8mb4(連接、庫、表、列),杜絕亂碼
  • 連接池:PHP-FPM 持久連接 mysqli::persistent / PDO ATTR_PERSISTENT,配合 max_connections 評估
  • 錯誤模式:開發環境顯示錯誤,生產環境記錄日誌 error_log,不暴露用戶
  • SQL 注入防護:全量使用預處理,拒絕字符串拼接 SQL
  • 嚴格模式:MySQL sql_mode=STRICT_TRANS_TABLES,NO_ENGINE_SUBSTITUTION

六、 總結

PHP 操作 MySQL 現代棧:PDO 為首選,mysqli 為備選,mysql 絕對禁用。核心鐵律:utf8mb4 全鏈路、預處理防注入、異常捕獲記錄、連接池複用。新項目直接上 PDO + 嚴格模式,老項目逐步遷移,徹底告別 mysql_* 時代。

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