PHP 早期 mysql_* 函數已於 PHP 7.0 移除,現代開發請使用 mysqli 或 PDO。本文整理舊版函數對照表供維護舊專案參考,並補充現代寫法對照。
| 功能 | 函數 | 說明與現代替代 |
|---|---|---|
| 建立連線 | mysql_connect() | 非持久連線。替代: mysqli_connect() 或 new PDO() |
| 持久連線 | mysql_pconnect() | 連線池複用。替代: mysqli::real_connect() with MYSQLI_CLIENT_PERSISTENT |
| 關閉連線 | mysql_close() | 替代: mysqli_close() / PDO=null |
| 選擇資料庫 | mysql_select_db() | 替代: mysqli_select_db() / DSN 指定 dbname |
| 執行查詢 | mysql_query() | 回傳 resource/bool。替代: mysqli_query() / PDO::query() |
| 執行查詢(指定庫) | mysql_db_query() | 不推薦。替代: 先 SELECT DB 再查詢 |
| 取單一欄位值 | mysql_result() | 效率最低。替代: mysqli_fetch_row/array/assoc/object |
| 取得索引陣列 | mysql_fetch_row() | 替代: mysqli_fetch_row() / PDO::fetch(PDO::FETCH_NUM) |
| 取得關聯/雙模陣列 | mysql_fetch_array() | result_type: MYSQL_ASSOC/NUM/BOTH。替代: mysqli_fetch_array() / PDO::FETCH_ASSOC|NUM|BOTH |
| 取得關聯陣列 | mysql_fetch_assoc() | 替代: mysqli_fetch_assoc() / PDO::FETCH_ASSOC |
| 取得物件 | mysql_fetch_object() | 替代: mysqli_fetch_object() / PDO::FETCH_OBJ |
| 影響行數 | mysql_affected_rows() | INSERT/UPDATE/DELETE。替代: mysqli_affected_rows() / PDOStatement::rowCount() |
| 結果集行數 | mysql_num_rows() | 僅 SELECT 有效。替代: mysqli_num_rows() / PDOStatement::rowCount() (不保證) |
| 釋放結果集 | mysql_free_result() | 替代: mysqli_free_result() / PDOStatement=null |
| 欄位數 | mysql_num_fields() | 替代: mysqli_num_fields() / PDOStatement::columnCount() |
| 欄位中繼資料 | mysql_fetch_field() | 回傳物件含 name/table/max_length/type/flags... 替代: mysqli_fetch_field() / PDOStatement::getColumnMeta() |
| 欄位名稱 | mysql_field_name() | 替代: mysqli_fetch_field_direct() |
| 欄位型別 | mysql_field_type() | 替代: mysqli_fetch_field_direct() |
| 欄位長度 | mysql_field_len() | 替代: mysqli_fetch_field_direct() |
| 欄位 Flags | mysql_field_flags() | 替代: mysqli_fetch_field_direct() |
| 列出資料庫 | mysql_list_dbs() | 替代: mysqli_query("SHOW DATABASES") |
| 列出資料表 | mysql_list_tables() | 替代: mysqli_query("SHOW TABLES") |
| 列出欄位 | mysql_list_fields() | 替代: mysqli_query("SHOW COLUMNS FROM tbl") |
| 資料庫名稱(從結果集) | mysql_db_name() | 替代: 不再需要 |
| 資料表名稱(從結果集) | mysql_tablename() | 替代: 不再需要 |
$mysqli = new mysqli("localhost", "user", "pass", "db");
if ($mysqli->connect_errno) die("Connect failed: " . $mysqli->connect_error);
$mysqli->set_charset("utf8mb4");
$sql = "SELECT id, name FROM users WHERE status=1 ORDER BY id DESC LIMIT 10";
$stmt = $mysqli->prepare($sql);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
echo "ID: {$row['id']}, Name: {$row['name']}
";
}
$result->free();
$stmt->close();
$mysqli->close();
$dsn = "mysql:host=localhost;dbname=db;charset=utf8mb4";
$pdo = new PDO($dsn, "user", "pass", [
PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
PDO::ATTR_EMULATE_PREPARES => false,
]);
$stmt = $pdo->prepare("SELECT id, name FROM users WHERE status=1 ORDER BY id DESC LIMIT 10");
$stmt->execute();
foreach ($stmt as $row) {
echo "ID: {$row['id']}, Name: {$row['name']}
";
}
CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci。charset=utf8mb4 (PDO) / set_charset("utf8mb4") (mysqli)。header("Content-Type: text/html; charset=utf-8"); 或 <meta charset="utf-8">。mysql_*:mysql_query("SET NAMES utf8mb4"); 緊接連線後執行。mysql_*,再切換底層實作為 PDO,業務邏輯不變。mysql_* 函數已成歷史,掌握 mysqli/PDO 才是現代 PHP 開發者必備技能。本表可作為舊碼維護期間的快速對照,新代碼請勿再使用。