萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

MySQL 5.5+ 棄用 mysql_connect 完整遷移指南:mysqli/PDO 方案與兼容處理

錯誤提示與版本背景

Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead

PHP 5.5+ 棄用 ext/mysql,PHP 7.0+ 完全移除。必須遷移至 mysqli 或 PDO。

三種應對策略(按推薦度)

策略一:全面遷移至 mysqli/PDO(根治,推薦)

mysqli 面向對象風格

$mysqli = new mysqli('localhost', 'user', 'pass', 'db');
$mysqli->set_charset('utf8mb4');

$result = $mysqli->query('SELECT * FROM users');
while ($row = $result->fetch_assoc()) { /* ... */ }

$stmt = $mysqli->prepare('INSERT INTO users(name) VALUES(?)');
$stmt->bind_param('s', $name);
$stmt->execute();

PDO 通用數據庫抽象層

$pdo = new PDO('mysql:host=localhost;dbname=db;charset=utf8mb4', 'user', 'pass');
$pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

$stmt = $pdo->query('SELECT * FROM users');
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { /* ... */ }

$stmt = $pdo->prepare('INSERT INTO users(name) VALUES(?)');
$stmt->execute([$name]);

策略二:臨時屏蔽棄用警告(過渡期應急)

// PHP 代碼首行
error_reporting(E_ALL & ~E_DEPRECATED);

或修改 php.ini:

error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off  # 生產環境建議關閉顯示

⚠️ 僅作過渡,PHP 7+ 將直接報致命錯誤。

策略三:封裝兼容層(舊項目快速適配)

// compat_mysql.php
function mysql_connect($host, $user, $pass) {
    static $link;
    if (!$link) $link = new mysqli($host, $user, $pass);
    return $link;
}
function mysql_query($sql, $link=null) {
    global $mysqli;
    return $mysqli->query($sql);
}
function mysql_fetch_array($result, $type=MYSQLI_BOTH) {
    return $result->fetch_array($type);
}
// ... 其它常用函數映射

通过 auto_prepend_file 引入,實現零改動兼容。

遷移核心差異表

特性mysql (舊)mysqliPDO
預處理語句不支持支持支持
事務控制函數式OO/過程式OO
多數據庫支持否僅 MySQL多種驅動
異常處理無可選原生異常
性能基準略優略低

遷移檢查清單

  • [ ] 所有 mysql_* 調用替換
  • [ ] SQL 注入防護:全部改用預處理
  • [ ] 字符集統一 utf8mb4
  • [ ] 錯誤處理改用異常/錯誤碼
  • [ ] 測試覆蓋核心業務流程

總結

盡早完成遷移,PDO 推薦新項目(可移植性),mysqli 推薦舊項目改造(API 相似度高)。臨時屏蔽警告僅為爭取遷移時間,不可長期依賴。

copyright © 萬盛學電腦網 all rights reserved