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

PHP mysql_fetch_assoc() 函數詳解:用法、差異與最佳實踐(附遷移建議)

     編輯:MySQL 資料庫相關知識

函數定義與用途

mysql_fetch_assoc() 從結果集中取得一行,以關聯陣列(欄位名為鍵)形式返回。若無更多行,返回 false。

array mysql_fetch_assoc ( resource $result )

參數:$result 為 mysql_query() 返回的結果資源指標。

核心特性與常見誤區

完整範例:從連線到釋放

<?php
$host = 'localhost';
$user = 'app_user';
$pass = 'StrongP@ssw0rd!';
$db   = 'test_db';

$conn = mysqli_connect($host, $user, $pass, $db);
if (!$conn) {
    die('連線失敗: ' . mysqli_connect_error());
}

$sql = "SELECT `LastName`, `FirstName`, `City` FROM `Person` WHERE `LastName` = 'Adams'";
$result = mysqli_query($conn, $sql);

if (!$result) {
    die('查詢錯誤: ' . mysqli_error($conn));
}

while ($row = mysqli_fetch_assoc($result)) {
    // $row 為關聯陣列:['LastName' => 'Adams', 'FirstName' => 'John', 'City' => 'London']
    echo "{$row['FirstName']} {$row['LastName']} 來自 {$row['City']}<br>";
}

mysqli_free_result($result);
mysqli_close($conn);
?>

關鍵差異對照表

特性說明
返回格式僅關聯索引(如 ['username' => 'john']),無數字索引
大小寫敏感欄位名鍵值區分大小寫,需與 SQL 別名一致
等價寫法mysql_fetch_array($result, MYSQL_ASSOC)
指標移動每次呼叫內部資料指標自動下移一行
資源釋放迴圈結束後建議 mysql_free_result($result)
函數返回類型適用場景效能備註
mysql_fetch_assoc關聯陣列只需欄位名存取,程式碼可讀性最高略快於 fetch_array
mysql_fetch_array關聯+數字(預設)需同時用欄位名與索引存取記憶體佔用雙倍
mysql_fetch_row數字索引陣列只需順序存取,不關心欄位名最省記憶體
mysql_fetch_object物件物件導向風格,屬性名=欄位名物件建立開銷稍大

⚠️ 重大警告:mysql_* 函數已棄用並移除

  • PHP 5.5.0:棄用,產生 E_DEPRECATED
  • PHP 7.0.0:完全移除,程式將直接報錯

所有存量專案必須遷移至以下其中一種:

遷移方案 A:MySQLi(程序風格,改動最小)

$conn = mysqli_connect($host, $user, $pass, $db);
$result = mysqli_query($conn, $sql);
while ($row = mysqli_fetch_assoc($result)) { /* ... */ }
mysqli_free_result($result);
mysqli_close($conn);

遷移方案 B:PDO(物件導向、支援多資料庫、預處理語句)

$pdo = new PDO("mysql:host=$host;dbname=$db;charset=utf8mb4", $user, $pass, [
    PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,
    PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC,
]);
$stmt = $pdo->query($sql);
while ($row = $stmt->fetch()) { /* $row 直接是關聯陣列 */ }

安全最佳實踐(無論新舊 API)

  1. 預處理語句:防 SQL 注入,mysqli_prepare() / PDO::prepare()
  2. 最小權限帳號:應用帳號僅擁有必要 DB 的 SELECT/INSERT/UPDATE/DELETE
  3. 錯誤資訊不外露:生產環境關閉 display_errors,記錄至日誌
  4. 字元集統一 utf8mb4:連線、資料庫、表、欄位全鏈路一致
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved