PHP 5.5 起 mysql_* 系列函數被標記為棄用,PHP 7.0 完全移除。遇到 Deprecated: mysql_connect(): The mysql extension is deprecated 警告,必須遷移至 MySQLi 或 PDO。本文提供完整遷移範例與快速修復方案。
<?php error_reporting(E_ALL & ~E_DEPRECATED); // 僅隱藏警告,不解決根本問題 ?>
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]);
<?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 |
mysql_ 確認所有調用點。prepare + bind_param/execute)。utf8mb4。盡早完成遷移,不僅消除棄用警告,更能大幅提升應用安全性與可維護性。