⚠️ 重要前提
mysql_* 函數自 PHP 5.5 棄用,PHP 7.0 移除。 新專案請使用 mysqli 或 PDO_MySQL。本文僅供維護老專案參考。
五大分類 25 核心函數
1. 連線管理(4 個)
| 函數 | 用途 | 現代替代 |
mysql_connect() | 短連線 | mysqli_connect() / new PDO() |
mysql_pconnect() | 長連線(連線池) | mysqli_pconnect() / PDO ATTR_PERSISTENT |
mysql_close() | 關閉短連線 | mysqli_close() / PDO=null |
mysql_select_db() | 選擇資料庫 | mysqli_select_db() / DSN 指定 |
2. 查詢執行(3 個)
| 函數 | 用途 | 現代替代 |
mysql_query() | 執行 SQL,返回資源/布爾 | mysqli_query() / PDO::query()/exec() |
mysql_db_query() | 指定庫執行(不推薦) | 先 select_db 再 query |
mysql_unbuffered_query() | 不緩衝結果集(大結果集) | mysqli_query(..., MYSQLI_USE_RESULT) |
3. 結果集獲取(7 個)
| 函數 | 返回類型 | 現代替代 |
mysql_result() | 單值(效能最差) | 棄用,改用 fetch_* |
mysql_fetch_row() | 數值索引陣列 | mysqli_fetch_row() |
mysql_fetch_array() | 雙模式(MYSQL_ASSOC/NUM/BOTH) | mysqli_fetch_array() |
mysql_fetch_assoc() | 關聯陣列 | mysqli_fetch_assoc() |
mysql_fetch_object() | 物件 | mysqli_fetch_object() |
mysql_fetch_lengths() | 各欄位長度陣列 | mysqli_fetch_lengths() |
mysql_num_rows() | SELECT 行數 | mysqli_num_rows() |
4. 寫入影響統計(2 個)
| 函數 | 用途 | 現代替代 |
mysql_affected_rows() | INSERT/UPDATE/DELETE 影響行數 | mysqli_affected_rows() |
mysql_insert_id() | 最後 AUTO_INCREMENT 值 | mysqli_insert_id() |
5. 元資料與清單(9 個)
| 函數 | 用途 | 現代替代 |
mysql_list_dbs() | 資料庫列表 | mysqli_query('SHOW DATABASES') |
mysql_db_name() | 從列表資源取庫名 | 直接 fetch 陣列 |
mysql_list_tables() | 表列表 | SHOW TABLES |
mysql_tablename() | 從列表資源取表名 | 直接 fetch 陣列 |
mysql_list_fields() | 欄位列表資源 | SHOW COLUMNS / DESC |
mysql_num_fields() | 欄位數 | mysqli_num_fields() |
mysql_fetch_field() | 欄位物件(12 屬性) | mysqli_fetch_field() |
mysql_field_flags() | 欄位旗標 | mysqli_fetch_field()->flags |
mysql_field_len() | 欄位最大長度 | mysqli_fetch_field()->length |
欄位物件 12 屬性速查
name, table, max_length, not_null, primary_key, unique_key,
multiple_key, numeric, blob, type, unsigned, zerofill
遷移對照速查表
| 舊寫法 | mysqli 寫法 | PDO 寫法 |
mysql_connect('h','u','p') | mysqli_connect('h','u','p','db') | new PDO('mysql:host=h;dbname=db','u','p') |
mysql_query($sql) | $mysqli->query($sql) | $pdo->query($sql) |
mysql_fetch_array($res, MYSQL_ASSOC) | $res->fetch_assoc() | $stmt->fetch(PDO::FETCH_ASSOC) |
mysql_real_escape_string($v) | $mysqli->real_escape_string($v) | 預處理參數綁定(無需轉義) |
mysql_insert_id() | $mysqli->insert_id | $pdo->lastInsertId() |
預處理語句範例(mysqli / PDO 核心優勢)
// mysqli
$stmt = $mysqli->prepare('SELECT * FROM users WHERE id > ? AND status = ?');
$stmt->bind_param('is', $minId, $status);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) { ... }
// PDO
$stmt = $pdo->prepare('SELECT * FROM users WHERE id > :min AND status = :st');
$stmt->execute(['min' => $minId, 'st' => $status]);
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ... }
預處理 = **SQL 注入免疫** + **執行計畫複用** + **二進位協議更快**。這是遷移的核心動力。