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

MySQL 5.5+ 棄用 mysql_* 函數遷移指南

     編輯:MySQL 綜合教學

PHP 5.5+ 棄用、PHP 7.0+ 移除 mysql_* 系列函數(mysql_connect、mysql_query 等),升級 MySQL 5.5 後出現 Deprecated: mysql_connect(): The mysql extension is deprecated... 警告。本文提供三級遷移方案。

警告信息

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

方案一:暫時屏蔽警告(應急,不解決根因)

<?php
// 代碼開頭
error_reporting(E_ALL & ~E_DEPRECATED);
或修改 php.ini:
error_reporting = E_ALL & ~E_DEPRECATED
display_errors = Off  # 生產環境建議關閉顯示

缺點:掩蓋問題,PHP 7+ 直接報致命錯誤,必須遷移。

方案二:遷移到 mysqli(面向過程/對象雙模式)

1. 面向過程風格(最接近 mysql_*,改動最小)

<?php
// 連接
$mysqli = mysqli_connect('localhost', 'root', 'root', 'dbname') 
    or die('連接失敗: ' . mysqli_connect_error());

// 字符集(關鍵)
mysqli_set_charset($mysqli, 'utf8mb4');

// 查詢
$sql = "SELECT * FROM users WHERE status = 1";
$result = mysqli_query($mysqli, $sql) or die(mysqli_error($mysqli));

// 遍歷
while ($row = mysqli_fetch_assoc($result)) {
    echo $row['name'] . '<br>';
}

// 釋放/關閉
mysqli_free_result($result);
mysqli_close($mysqli);

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

<?php
$mysqli = new mysqli('localhost', 'root', 'root', 'dbname');
if ($mysqli->connect_errno) die('連接失敗: ' . $mysqli->connect_error);
$mysqli->set_charset('utf8mb4');

// 預處理(防注入)
$stmt = $mysqli->prepare("SELECT * FROM users WHERE id = ?");
$stmt->bind_param('i', $uid);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { ... }
$stmt->close();
$mysqli->close();

方案三:遷移到 PDO(數據庫無關、更現代)

<?php
$dsn = 'mysql:host=localhost;dbname=dbname;charset=utf8mb4';
$pdo = new PDO($dsn, 'root', 'root', [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES => false,  // 真正預處理
]);

// 查詢
$stmt = $pdo->query("SELECT * FROM users WHERE status = 1");
foreach ($stmt as $row) { echo $row['name'] . '<br>'; }

// 預處理
$stmt = $pdo->prepare("INSERT INTO users (name, email) VALUES (?, ?)");
$stmt->execute(['張三', 'zhangsan@example.com']);
$lastId = $pdo->lastInsertId();

// 事務
$pdo->beginTransaction();
try {
    $pdo->exec("UPDATE accounts SET balance = balance - 100 WHERE id = 1");
    $pdo->exec("UPDATE accounts SET balance = balance + 100 WHERE id = 2");
    $pdo->commit();
} catch (Exception $e) {
    $pdo->rollBack();
    throw $e;
}

對比與選型

特性mysqliPDO
API 風格雙模式純 OO
多数據庫支援僅 MySQL12+ 驅動
預處理支援支援(模擬/原生可選)
命名參數不支援支援 :name
異步查詢支援不支援
學習曲線低(兼容舊代碼)中

遷移檢查清單

  1. 全局搜索 mysql_ 替換為 mysqli_ 或 PDO
  2. 所有變量輸入 SQL 必須用預處理,杜絕拼接
  3. 統一字符集 utf8mb4
  4. 錯誤處理改為異常/錯誤碼檢查
  5. 事務用 mysqli_begin_transaction / PDO::beginTransaction
  6. 測試所有 SQL 執行路徑

常見遷移陷阱

  • mysql_insert_id() → mysqli_insert_id($link) / $pdo->lastInsertId()
  • mysql_num_rows() → mysqli_num_rows($result) / $stmt->rowCount()(僅對 SELECT 可靠)
  • mysql_real_escape_string() → 棄用,改用預處理
  • mysql_free_result() → mysqli_free_result() / 自動釋放

總結

mysql_* 已成歷史。新項目直接用 PDO;存量項目優先改 mysqli 面向過程風格,漸進式引入預處理。遷移核心是「預處理替代拼接,異常替代錯誤碼」,不僅修復棄用警告,更從根本上消除 SQL 注入風險。

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