兩者皆用於從結果集逐行取得資料,核心差異在於陣列索引方式:
| 函數 | 索引類型 | 記憶體佔用 | 適用場景 |
|---|---|---|---|
mysql_fetch_row() | 數字索引(0 起始) | 較低 | 僅需順序存取欄位、效能敏感場合 |
mysql_fetch_array() | 數字 + 關聯索引(欄位名) | 較高(約雙倍) | 需以欄位名存取、程式碼可讀性優先 |
// 僅數字索引
$row = mysql_fetch_row($result);
// $row[0], $row[1]... 對應欄位順序
// 數字 + 關聯索引(預設 MYSQL_BOTH)
$row = mysql_fetch_array($result);
// $row[0] / $row['field_name'] 均可存取
// 可指定模式:MYSQL_NUM、MYSQL_ASSOC、MYSQL_BOTH
$row = mysql_fetch_array($result, MYSQL_ASSOC);
回傳值:成功時回傳陣列,無更多行時回傳 false。
$result = mysql_query("SELECT id, name, email FROM users");
while ($row = mysql_fetch_row($result)) {
echo "ID: {$row[0]}, Name: {$row[1]}, Email: {$row[2]}
";
}
$result = mysql_query("SELECT id, name, email FROM users");
while ($row = mysql_fetch_array($result, MYSQL_ASSOC)) {
echo "ID: {$row['id']}, Name: {$row['name']}, Email: {$row['email']}
";
}
mysql_fetch_row() 或 mysql_fetch_array($result, MYSQL_NUM) 減少記憶體壓力。MYSQL_ASSOC 以欄位名存取,Schema 變更時較不易出錯。mysql_* 函數已於 PHP 7.0 移除,新專案請改用 mysqli 或 PDO,對應方法為 fetch_row()、fetch_array()、fetch_assoc()。mysql_num_rows():取得結果集總行數mysql_insert_id():取得最後 INSERT 的自增 IDmysql_error():取得最後一次錯誤訊息mysql_close():關閉資料庫連線查詢前執行 mysql_query("SET NAMES 'GBK'") 或 SET NAMES 'utf8' 可解決中文亂碼,建議在連線建立後立即執行。