早期 PHP 使用 mysql_* 函式庫操作 MySQL(已於 PHP 7.0 移除,現建議使用 mysqli 或 PDO),但其結果集擷取模式仍具參考價值。本文展示三種常見方式:mysql_fetch_row()(數值索引陣列)、mysql_fetch_object()(物件)、mysql_fetch_array()(關聯/數值雙索引陣列)。
<?php
$dbh = @mysql_connect("localhost:3306", "root", "9999");
if (!$dbh) die("連線失敗");
@mysql_select_db("ok", $dbh);
$q = "SELECT * FROM abc";
?>
<?php
$rs = mysql_query($q, $dbh);
if (!$rs) die("查詢失效");
echo "<table><tr><th>ID</th><th>Name</th></tr>";
while ($row = mysql_fetch_row($rs)) {
echo "<tr><td>$row[0]</td><td>$row[1]</td></tr>";
}
echo "</table>";
?>
特點:回傳 [0]=>id, [1]=>name,須記住欄位順序,效能最好,記憶體佔用最低。
<?php
$rs = mysql_query($q, $dbh);
while ($row = mysql_fetch_object($rs)) {
echo "$row->id $row->name <br />";
}
?>
特點:以屬性名存取($row->id),程式碼可讀性高,適合物件導向開發,效能略低於 row。
<?php
$rs = mysql_query($q, $dbh);
while ($row = mysql_fetch_array($rs)) {
echo "$row[id] $row[name] <br />";
}
?>
特點:同時提供數值與關聯索引($row[0] 同 $row['id']),靈活但記憶體佔用較大。若只需關聯索引,可用 mysql_fetch_assoc()。
| 函式 | 回傳型別 | 記憶體 | 適用場景 |
|---|---|---|---|
| fetch_row | 數值索引陣列 | 最低 | 大量資料、效能優先、欄位固定 |
| fetch_object | stdClass 物件 | 中等 | OOP 專案、程式碼可讀性優先 |
| fetch_array | 雙索引陣列 | 最高 | 需同時以數值/關聯存取、快速原型 |
| fetch_assoc | 關聯索引陣列 | 中等 | 僅需欄位名存取、現代專案推薦 |
請勿在新專案使用 mysql_* 函式。請改用:
$mysqli->query() 搭配 fetch_assoc()/fetch_object()$pdo->query() 搭配 fetch(PDO::FETCH_ASSOC)/FETCH_OBJ兩者皆支援預處理語句,有效防範 SQL 注入。