在早期 PHP 開發中(mysql_* 擴展已棄用,現建議使用 PDO 或 MySQLi),從 MySQL 結果集獲取資料主要有四種函數:mysql_result()、mysql_fetch_row()、mysql_fetch_array()、mysql_fetch_object()。本文通過實例代碼與性能分析,幫助開發者理解各自特點並做出最佳選擇。
<?php
$conn = mysql_connect("localhost", "root", "password");
mysql_select_db("test", $conn);
$query = "SELECT * FROM users";
$result = mysql_query($query, $conn);
for ($i = 0; $i < 7; $i++) {
echo "用戶ID:" . mysql_result($result, $i, "user_id") . "<br>";
echo "用戶名:" . mysql_result($result, $i, "user_name") . "<br>";
}
?>
特點:可指定行號與欄位名直接取值,語法直觀。但每次調用都需定位行指針,大數據集下效率極低,不推薦用於批量讀取。
<?php
while ($row = mysql_fetch_row($result)) {
echo "用戶ID:" . $row[0] . "<br>";
echo "用戶名:" . $row[1] . "<br>";
}
?>
特點:返回數值索引陣列($row[0], $row[1]...),四種方式中執行效率最高。缺點是需記住欄位順序,維護性差,易因表結構變更導致錯誤。
<?php
while ($row = mysql_fetch_array($result)) {
echo "用戶ID:" . $row["user_id"] . "<br>"; // 關聯鍵名
echo "用戶名:" . $row["user_name"] . "<br>";
// 同時也可用 $row[0], $row[1]
}
?>
特點:預設返回雙模式陣列(數值索引 + 關聯索引),效能與 mysql_fetch_row() 接近,且支援欄位名訪問,代碼可讀性強,實際項目中最常用。可傳入 MYSQL_ASSOC、MYSQL_NUM、MYSQL_BOTH 控制返回類型。
<?php
while ($row = mysql_fetch_object($result)) {
echo "用戶ID:" . $row->user_id . "<br>";
echo "用戶名:" . $row->user_name . "<br>";
}
?>
特點:返回 stdClass 物件,屬性對應欄位名。適合物件導向架構,邏輯清晰,處理複雜結構資料時優勢明顯。效能略低於陣列方式,但可忽略不計。
| 函數 | 返回類型 | 效能 | 適用場景 |
|---|---|---|---|
| mysql_result | 單一值 | 最低 | 極少量、隨機存取 |
| mysql_fetch_row | 數值索引陣列 | 最高 | 高效能、固定結構、不介意維護成本 |
| mysql_fetch_array | 雙模式陣列 | 高 | 通用首選,平衡效能與可讀性 |
| mysql_fetch_object | 物件 | 中高 | OOP 專案、複雜業務邏輯 |
現代建議:新專案請使用 PDO 或 MySQLi(預處理語句、物件介面、支援多資料庫),mysql_* 函數自 PHP 5.5 棄用,PHP 7.0 移除。