從 mysql_* 到 mysqli / PDO 的演進
原文列出的 mysql_* 函數已在 PHP 7.0 完全移除。現代開發請使用 mysqli(面向過程/物件) 或 PDO(資料存取抽象層)。本文保留函數對應關係供遷移參考,並補充現代寫法。
連接管理
| 功能 | 舊 mysql_* | mysqli(物件) | PDO |
| 建立連接 | mysql_connect() | new mysqli() | new PDO() |
| 持久連接 | mysql_pconnect() | new mysqli(..., MYSQLI_CLIENT_PERSISTENT) | PDO::ATTR_PERSISTENT => true |
| 關閉連接 | mysql_close() | $mysqli->close() | $pdo = null |
| 選擇資料庫 | mysql_select_db() | $mysqli->select_db() | DSN 指定 dbname |
查詢執行
| 功能 | 舊 mysql_* | mysqli | PDO |
| 執行查詢 | mysql_query() | $mysqli->query() | $pdo->query() |
| 預處理語句 | 不支援 | $mysqli->prepare() | $pdo->prepare() |
| 多查詢 | 不支援 | $mysqli->multi_query() | 不直接支援 |
結果集處理
| 功能 | 舊 mysql_* | mysqli | PDO |
| 關聯陣列 | mysql_fetch_assoc() | $result->fetch_assoc() | $stmt->fetch(PDO::FETCH_ASSOC) |
| 數值索引 | mysql_fetch_row() | $result->fetch_row() | $stmt->fetch(PDO::FETCH_NUM) |
| 物件 | mysql_fetch_object() | $result->fetch_object() | $stmt->fetch(PDO::FETCH_OBJ) |
| 所有資料 | 無 | $result->fetch_all() | $stmt->fetchAll() |
| 釋放結果 | mysql_free_result() | $result->free() | $stmt = null |
資訊查詢
| 功能 | 舊 mysql_* | mysqli | PDO |
| 影響行數 | mysql_affected_rows() | $mysqli->affected_rows | $stmt->rowCount() |
| 結果行數 | mysql_num_rows() | $result->num_rows | 需自行計算 |
| 欄位數 | mysql_num_fields() | $result->field_count | $stmt->columnCount() |
| 插入 ID | mysql_insert_id() | $mysqli->insert_id | $pdo->lastInsertId() |
| 錯誤訊息 | mysql_error() | $mysqli->error | $pdo->errorInfo() |
| 錯誤代碼 | mysql_errno() | $mysqli->errno | $pdo->errorCode() |
資料庫/資料表中繼資料
SHOW DATABASES / $mysqli->query("SHOW DATABASES")
SHOW TABLES / $mysqli->query("SHOW TABLES")
DESCRIBE table_name / $mysqli->query("DESCRIBE tbl")
SHOW CREATE TABLE tbl 取得建表語句
- mysqli:
$result->fetch_fields() 取得欄位物件(name, type, length, flags 等)
遷移建議
- 使用 PDO 作為新專案預設選擇(支援多資料庫、命名參數、異常處理)
- 既有 mysqli 專案可維持,但啟用
MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT 讓錯誤拋出異常
- 所有動態查詢必須使用預處理語句,防止 SQL 注入
- 統一字符集為
utf8mb4(DSN: charset=utf8mb4 / $mysqli->set_charset('utf8mb4'))
- 善用事務:
$pdo->beginTransaction()、commit()、rollBack()