萬盛學電腦網

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

PHP 查詢 MySQL 四大獲取方式深度對比與最佳實踐

PHP 早期的 mysql_* 系列函數提供了四種獲取結果集的方式,雖然這些函數已在 PHP 7.0 移除(建議改用 PDO 或 mysqli),但理解其底層差異對維護舊項目、把握數據獲取本質仍有價值。本文逐一拆解並給出性能對比結論。

四種獲取方式代碼演示

1. mysql_result() —— 單元級隨機訪問

<?php
$conn = mysql_connect("localhost", "root", "password");
mysql_select_db("test", $conn);
$result = mysql_query("SELECT * FROM users", $conn);

for ($i = 0; $i < 7; $i++) {
    echo "用戶ID:" . mysql_result($result, $i, "user_id") . "<br>";
    echo "用戶名:" . mysql_result($result, $i, "user_name") . "<br>";
}
?>

特點:可指定行號、列名隨機讀取;但每次調用都內部定位,大數據集效率極低。

2. mysql_fetch_row() —— 數字索引數組

<?php
$conn = mysql_connect("localhost", "root", "password");
mysql_select_db("test", $conn);
$result = mysql_query("SELECT * FROM users", $conn);

while ($row = mysql_fetch_row($result)) {
    echo "用戶ID:" . $row[0] . "<br>";
    echo "用戶名:" . $row[1] . "<br>";
}
?>

特點:返回 0 基數字索引數組,速度最快,但可讀性差,易因列順序變更導致 Bug。

3. mysql_fetch_array() —— 雙模式數組(推薦)

<?php
$conn = mysql_connect("localhost", "root", "password");
mysql_select_db("test", $conn);
$result = mysql_query("SELECT * FROM users", $conn);

while ($row = mysql_fetch_array($result)) {
    // 同時支持 $row[0] 和 $row['user_id']
    echo "用戶ID:" . $row['user_id'] . "<br>";
    echo "用戶名:" . $row['user_name'] . "<br>";
}
?>

特點:默認返回數字+關聯雙索引數組(MYSQL_BOTH),兼顧性能與可讀性,實際開發最常用。

4. mysql_fetch_object() —— 對象映射

<?php
$conn = mysql_connect("localhost", "root", "root");
mysql_select_db("test", $conn);
$result = mysql_query("SELECT * FROM users", $conn);

while ($row = mysql_fetch_object($result)) {
    echo "用戶ID:" . $row->user_id . "<br>";
    echo "用戶名:" . $row->user_name . "<br>";
}
?>

特點:返回匿名對象,屬性對應列名,適合面向對象代碼風格,邏輯清晰但略慢於數組方式。

性能與適用性綜合對比

函數速度訪問方式適用場景備註
mysql_result★☆☆☆☆行號+列名極小結果集、隨機訪問大數據集禁用
mysql_fetch_row★★★★★數字索引高性能、固定列順序維護成本高
mysql_fetch_array★★★★☆數字+關聯通用業務開發首選默認雙索引佔內存
mysql_fetch_object★★★☆☆對象屬性OOP 專案、結構複雜數據構建對象有開銷

現代化建議

  • 新項目:直接使用 PDO::fetch(PDO::FETCH_ASSOC) 或 mysqli_fetch_assoc()
  • 舊項目維護:統一遷移至 mysql_fetch_array($result, MYSQL_ASSOC) 仅返回關聯數組,兼顧性能與清晰度
  • 大數據集:考慮游標分批獲取或服務端流式處理

理解底層差異,才能在技術棧演進中做出正確選擇。

copyright © 萬盛學電腦網 all rights reserved