函數定義與核心特性
array|false mysql_fetch_row(resource $result)
- 返回索引數組(0,1,2...對應字段順序)
- 每次調用自動將結果集指針移至下一行
- 無數據時返回
false
- 不支持關聯鍵訪問,僅能用
$row[0]、$row[1]
完整實戰代碼模板
<?php
// 1. 連接數據庫(推薦 mysqli/PDO,此處為演示 mysql_* 兼容寫法)
$conn = mysqli_connect('localhost', 'root', 'password', 'Books');
if (!$conn) die('Connection failed: ' . mysqli_connect_error());
// 2. 執行查詢
$query = "SELECT * FROM Computers WHERE price >= 20";
$result = mysqli_query($conn, $query);
if (!$result) die('Query failed: ' . mysqli_error($conn));
// 3. 循環獲取行數據
while ($row = mysqli_fetch_row($result)) {
// $row 為索引數組:[0=>id, 1=>name, 2=>price, 3=>publish_date...]
echo "書名:{$row[1]}
";
echo "價格:{$row[2]}
";
echo "出版日期:{$row[3]}
";
}
// 4. 釋放結果集
mysqli_free_result($result);
// 5. 關閉連接
mysqli_close($conn);
?>
輸出結果示例
書名:數據結構
價格:20
出版日期:2001-01-01
書名:C語言
價格:23
出版日期:1998-04-04
書名:PHP入門技術
價格:22
出版日期:2005-05-01
關鍵注意事項
- 索引對應字段順序:
SELECT * 依賴表結構順序,生產環境禁用 SELECT *,顯式列出字段
- 越界訪問風險:
$row[99] 不報錯返回 NULL,難以排查
- 字段重名覆蓋:JOIN 產生同名字段時,後者覆蓋前者,索引數組無法區分
- 類型轉換:所有值均為字符串,數值需
intval()/floatval() 轉換
三大獲取函數對比
| 函數 | 返回結構 | 訪問方式 | 適用場景 |
| mysql_fetch_row | 索引數組 [0,1,2...] | $row[0] | 高性能、固定結構、無需字段名 |
| mysql_fetch_assoc | 關聯數組 ['field'=>val] | $row['name'] | 語義清晰、字段名可讀、推薦日常使用 |
| mysql_fetch_array | 雙模式(索引+關聯) | $row[0] / $row['name'] | 兼容舊代碼、內存佔用雙倍 |
| mysql_fetch_object | 對象 stdClass | $row->name | 面向對象風格、屬性訪問 |
現代 mysqli/PDO 等效寫法
mysqli (面向過程)
while ($row = mysqli_fetch_row($result)) { ... }
// 或
while ($row = $result->fetch_row()) { ... }
PDO
$stmt = $pdo->query($query);
while ($row = $stmt->fetch(PDO::FETCH_NUM)) { ... } // 索引數組
while ($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ... } // 關聯數組
while ($row = $stmt->fetch(PDO::FETCH_BOTH)) { ... } // 雙模式
while ($row = $stmt->fetch(PDO::FETCH_OBJ)) { ... } // 對象
性能提示
FETCH_NUM (fetch_row) 最快,內存佔用最小
- 大結果集建議
MYSQLI_USE_RESULT / PDO 游標模式流式讀取
- 釋放結果集
free_result() 及時釋放內存