首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

PHP 操作 MySQL 函數大全:從連線到欄位元資料完整速查

     編輯:MySQL 資料庫相關知識

前言

PHP 早期 mysql_* 函數已於 PHP 7.0 移除,現代開發請使用 mysqli 或 PDO。本文整理舊版函數對照表供維護舊專案參考,並補充現代寫法對照。

一、核心函數對照表 (mysql_* 系列)

功能函數說明與現代替代
建立連線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()
欄位 Flagsmysql_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 物件導向

$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();

PDO (可攜性最佳)

$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']}
"; }

三、常見中文亂碼解決方案總結

  1. 資料庫/表/欄位:CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci。
  2. 連線字串:charset=utf8mb4 (PDO) / set_charset("utf8mb4") (mysqli)。
  3. PHP 腳本檔案儲存為 UTF-8 無 BOM。
  4. HTML 輸出:header("Content-Type: text/html; charset=utf-8"); 或 <meta charset="utf-8">。
  5. 舊專案若必須用 mysql_*:mysql_query("SET NAMES utf8mb4"); 緊接連線後執行。

四、遷移建議

  • 新專案直接使用 PDO,支援多資料庫、預處理預設關閉模擬、異常模式。
  • 舊專案逐模組重構:先建立資料庫存取層 (DAO/Repository) 封裝 mysql_*,再切換底層實作為 PDO,業務邏輯不變。
  • 善用靜態分析工具 (Psalm, PHPStan) 偵測已棄用函數。

總結

mysql_* 函數已成歷史,掌握 mysqli/PDO 才是現代 PHP 開發者必備技能。本表可作為舊碼維護期間的快速對照,新代碼請勿再使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved