首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

解決 PHP Deprecated: mysql_connect() 已棄用警告:遷移至 mysqli/PDO 完整指南

     編輯:PHP 相關知識

解決 PHP Deprecated: mysql_connect() 已棄用警告:遷移至 mysqli/PDO 完整指南

PHP 5.5 起 mysql_* 系列函數被標記為棄用,PHP 7.0 完全移除。遇到 Deprecated: mysql_connect(): The mysql extension is deprecated 警告,必須遷移至 MySQLi 或 PDO。本文提供完整遷移範例與快速修復方案。

一、為何棄用?

  • 不支援預處理語句,易導致 SQL 注入。
  • 無物件導向介面,程式碼難維護。
  • 缺乏事務、多查詢、準備語句等現代特性。

二、快速修復:抑制警告(不推薦長期使用)

<?php
error_reporting(E_ALL & ~E_DEPRECATED); // 僅隱藏警告,不解決根本問題
?>

三、方案 A:遷移至 PDO(推薦)

PDO 提供統一介面支援多種資料庫,支援預處理、事務、異常處理。

基本連線

<?php
$dsn = 'mysql:host=localhost;dbname=test;charset=utf8mb4';
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, $user, $pass, $opt);
?>

查詢範例

// 查詢單筆
$stmt = $pdo->prepare('SELECT * FROM users WHERE id = ?');
$stmt->execute([$id]);
$user = $stmt->fetch();

// 查詢多筆
$stmt = $pdo->query('SELECT * FROM users');
$users = $stmt->fetchAll();

// 寫入
$pdo->prepare('INSERT INTO users (name, email) VALUES (?, ?)')->execute([$name, $email]);

四、方案 B:遷移至 MySQLi(程序式/物件式)

物件式(推薦)

<?php
$mysqli = new mysqli('localhost', 'user', 'pass', 'dbname');
if ($mysqli->connect_errno) {
    die("Connect failed: " . $mysqli->connect_error);
}
$mysqli->set_charset('utf8mb4');

// 預處理查詢
$stmt = $mysqli->prepare('SELECT * FROM users WHERE id = ?');
$stmt->bind_param('i', $id);
$stmt->execute();
$result = $stmt->get_result();
$user = $result->fetch_assoc();

// 事務
$mysqli->begin_transaction();
try {
    $mysqli->query('UPDATE accounts SET balance = balance - 100 WHERE id = 1');
    $mysqli->query('UPDATE accounts SET balance = balance + 100 WHERE id = 2');
    $mysqli->commit();
} catch (Exception $e) {
    $mysqli->rollback();
    throw $e;
}
?>

程序式(舊代碼快速替換)

$link = mysqli_connect('localhost', 'user', 'pass', 'dbname');
if (!$link) die('Connect error: ' . mysqli_connect_error());
mysqli_set_charset($link, 'utf8mb4');
$result = mysqli_query($link, 'SELECT * FROM users');
while ($row = mysqli_fetch_assoc($result)) { /* ... */ }

五、舊代碼批量替換對照表

mysql_* 函數MySQLi 物件式PDO
mysql_connect()new mysqli()new PDO()
mysql_query()$mysqli->query() / prepare()$pdo->query() / prepare()
mysql_fetch_assoc()$result->fetch_assoc()$stmt->fetch()
mysql_num_rows()$result->num_rows$stmt->rowCount()
mysql_real_escape_string()$mysqli->real_escape_string()預處理自動處理
mysql_insert_id()$mysqli->insert_id$pdo->lastInsertId()
mysql_affected_rows()$mysqli->affected_rows$stmt->rowCount()
mysql_close()$mysqli->close()$pdo = null

六、遷移檢查清單

  1. 全域搜尋 mysql_ 確認所有調用點。
  2. 建立資料庫連線單例或依賴注入容器管理連線。
  3. 所有動態 SQL 改用預處理語句(prepare + bind_param/execute)。
  4. 統一字元集為 utf8mb4。
  5. 錯誤處理改用異常(PDO::ERRMODE_EXCEPTION / mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT))。
  6. 測試所有讀寫路徑,驗證事務回滾行為。

盡早完成遷移,不僅消除棄用警告,更能大幅提升應用安全性與可維護性。

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