重要提示:mysql_* 系列函數自 **PHP 5.5 棄用、PHP 7.0 移除**。所有新專案**必須**使用 mysqli 或 PDO。本文整理舊函數對應關係,助力遷移重構。
| 舊 mysql_* 函數 | mysqli 面向過程 | mysqli 面向對象 | PDO |
|---|---|---|---|
| mysql_connect() | mysqli_connect() | new mysqli() | new PDO() |
| mysql_pconnect() | mysqli_pconnect() | new mysqli(..., MYSQLI_CLIENT_PERSISTENT) | PDO::ATTR_PERSISTENT => true |
| mysql_select_db() | mysqli_select_db() | $mysqli->select_db() | DSN 指定 dbname |
| mysql_query() | mysqli_query() | $mysqli->query() | $pdo->query()/exec() |
| mysql_fetch_array() | mysqli_fetch_array() | $result->fetch_array() | $stmt->fetch(PDO::FETCH_ASSOC) |
| mysql_fetch_assoc() | mysqli_fetch_assoc() | $result->fetch_assoc() | $stmt->fetch(PDO::FETCH_ASSOC) |
| mysql_fetch_row() | mysqli_fetch_row() | $result->fetch_row() | $stmt->fetch(PDO::FETCH_NUM) |
| mysql_fetch_object() | mysqli_fetch_object() | $result->fetch_object() | $stmt->fetch(PDO::FETCH_OBJ) |
| mysql_num_rows() | mysqli_num_rows() | $result->num_rows | $stmt->rowCount() (僅 SELECT) |
| mysql_affected_rows() | mysqli_affected_rows() | $mysqli->affected_rows | $stmt->rowCount() (INSERT/UPDATE/DELETE) |
| mysql_insert_id() | mysqli_insert_id() | $mysqli->insert_id | $pdo->lastInsertId() |
| mysql_error() | mysqli_error() | $mysqli->error | $pdo->errorInfo() |
| mysql_errno() | mysqli_errno() | $mysqli->errno | $pdo->errorCode() |
| mysql_real_escape_string() | mysqli_real_escape_string() | $mysqli->real_escape_string() | **預處理綁定參數**(無需轉義) |
| mysql_close() | mysqli_close() | $mysqli->close() | $pdo = null |
| mysql_free_result() | mysqli_free_result() | $result->free() | $stmt = null |
| mysql_list_dbs() | mysqli_query('SHOW DATABASES') | $mysqli->query('SHOW DATABASES') | $pdo->query('SHOW DATABASES') |
| mysql_list_tables() | mysqli_query('SHOW TABLES') | $mysqli->query('SHOW TABLES') | $pdo->query('SHOW TABLES') |
// mysqli 預處理
$stmt = $mysqli->prepare('SELECT * FROM users WHERE email = ?');
$stmt->bind_param('s', $email);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { ... }
// PDO 預處理
$stmt = $pdo->prepare('SELECT * FROM users WHERE email = :email');
$stmt->execute([':email' => $email]);
while ($row = $stmt->fetch()) { ... }
false,建議啟用異常模式 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);PDO 預設靜默,建議 $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION)。// mysqli
$mysqli->begin_transaction();
try { $mysqli->commit(); } catch { $mysqli->rollback(); }
// PDO
$pdo->beginTransaction();
try { $pdo->commit(); } catch { $pdo->rollBack(); }
mysqli_multi_query() 需配合 next_result() 遍歷結果集;PDO 不支援多語句(安全考量)。Database 介面,再替換底層實現。mysql_ 確認零殘留再上線。摒棄 mysql_*,擁抱預處理與現代異常處理,是 PHP 專案安全、可維護的基石。