萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

PHP 操作 MySQL 核心函數速查手冊:連接、查詢、結果集處理與錯誤處理

PHP 老舊 mysql_* 函數族完整參考(已棄用,僅供維護舊專案參考)

重要警示:mysql_* 函數自 PHP 5.5 棄用,PHP 7.0 移除。新專案**必須使用 PDO 或 MySQLi(支援預處理、物件導向、事務控制)**。本文僅為維護歷史代碼提供速查。

核心函數分類速查表

分類函數用途現代替代
連接管理mysql_connect(host, user, pass)建立非持久連接new mysqli() / new PDO()
mysql_pconnect(...)建立持久連接(進程級復用)PDO: PDO::ATTR_PERSISTENT
mysql_close([link])關閉連接$mysqli->close() / $pdo=null
資料庫選擇mysql_select_db(db_name, [link])選擇預設資料庫$mysqli->select_db() / DSN 指定
查詢執行mysql_query(sql, [link])發送 SQL(SELECT 回資源,DML 回 bool)$mysqli->query() / $pdo->query()
mysql_unbuffered_query(sql)非緩存查詢(大結果集串流)MYSQLI_USE_RESULT / PDO 游標
mysql_db_query(db, sql)指定庫執行(已棄用)切換 DB 或完整表名
結果集處理mysql_fetch_array(result, type)取一列關聯/數值/雙重陣列$stmt->fetch(PDO::FETCH_ASSOC|NUM|BOTH)
mysql_fetch_assoc(result)取關聯陣列FETCH_ASSOC
mysql_fetch_row(result)取數值索引陣列FETCH_NUM
mysql_num_rows(result)SELECT 結果列數$stmt->rowCount() (僅緩存)
mysql_affected_rows([link])INSERT/UPDATE/DELETE 影響列數$mysqli->affected_rows / $stmt->rowCount()
錯誤與資訊mysql_error([link])上一操作錯誤訊息$mysqli->error / $pdo->errorInfo()
mysql_errno([link])錯誤代碼$mysqli->errno
mysql_insert_id([link])上次 INSERT 產生的 AUTO_INCREMENT 值$mysqli->insert_id / $pdo->lastInsertId()
資訊mysql_get_server_info()MySQL 版本字串$mysqli->server_info

典型舊代碼模式與現代重寫對照

舊式程序風格

$link = mysql_connect("localhost", "root", "") or die("連線失敗: ".mysql_error());
mysql_select_db("mydb", $link);
$result = mysql_query("SELECT id, name FROM users WHERE status=1", $link);
while ($row = mysql_fetch_assoc($result)) {
    echo "ID: {$row['id']}, Name: {$row['name']}
"; } mysql_free_result($result); mysql_close($link);

現代 PDO 重寫(推薦)

$dsn = "mysql:host=localhost;dbname=mydb;charset=utf8mb4";
$opt = [
    PDO::ATTR_ERRMODE            => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
    PDO::ATTR_EMULATE_PREPARES   => false,
];
$pdo = new PDO($dsn, "root", "", $opt);

$stmt = $pdo->prepare("SELECT id, name FROM users WHERE status = ?");
$stmt->execute([1]);
while ($row = $stmt->fetch()) {
    echo "ID: {$row['id']}, Name: {$row['name']}
"; } // 無需手動 close,腳本結束自動釋放

現代 MySQLi 物件導向重寫

$mysqli = new mysqli("localhost", "root", "", "mydb");
if ($mysqli->connect_errno) die("連線失敗: ".$mysqli->connect_error);
$mysqli->set_charset("utf8mb4");

$stmt = $mysqli->prepare("SELECT id, name FROM users WHERE status = ?");
$stmt->bind_param("i", 1);
$stmt->execute();
$result = $stmt->get_result();
while ($row = $result->fetch_assoc()) {
    echo "ID: {$row['id']}, Name: {$row['name']}
"; } $stmt->close(); $mysqli->close();

遷移清單(舊專案升級必做)

  1. 全域搜尋 mysql_,列出所有呼叫點。
  2. 建立資料庫連接單例/連接池類(PDO/MySQLi)。
  3. 將所有 SQL 參數化(? / :name),消除 SQL 注入風險。
  4. 替換結果集遍歷邏輯(fetch_assoc / fetch_all)。
  5. 統一錯誤處理:拋出例外、記錄日誌、回傳標準錯誤碼。
  6. 移除 mysql_free_result、mysql_close 等手動資源管理(RAII 自動處理)。
  7. 執行完整回歸測試,重點驗證事務、批次操作、大結果集場景。

常見誤區澄清

  • mysql_pconnect 不會神奇解決效能問題:持久連接會佔用 MySQL 連接槽,若未妥善配置 wait_timeout、連接池大小,反而導致「Too many connections」。
  • mysql_insert_id 僅對當前連接有效:持久連接跨請求複用時,可能取到其他請求的 ID,務必在同一請求緊接 INSERT 後呼叫。
  • mysql_num_rows 僅適用 SELECT:DML 操作必須用 mysql_affected_rows。
copyright © 萬盛學電腦網 all rights reserved