自從看到foreach ($result as $key => $value)的寫法後,愈想愈覺得mysql_fetch_assoc()才是王道,如同PHP官網所寫,它多了很多便利性,並且效能和最陽春的mysql_fetch_row不相上下。
極端點的例子來說,自己寫一個loader,像Smarty一樣,會把自訂的keyword換成準備好的data,配合foreach的寫法,程式不需知道有幾種field、field名稱為何,就能把keyword轉成data。例如template.html長這樣:
<a href=#link#><img src=#source# /></a>
HTML裡的keyword要和table field同名,DB table img_link裡有多個field,其中兩個為link和source,loader可以這麼寫:
$str = file_get_contents("template.html");
$sql = "SELECT * from img_link";
$r = db_query($sql);
$assoc = mysql_fetch_assoc($r);
foreach ($assoc as $key => $val) {
preg_replace("/#$key#/", "'$val'", $str);
}
這個例子省略重覆template內容和while ($assoc = mysql_fetch_assoc($r))的寫法,只是描述概念而已,功能愈複雜時,愈顯得出mysql_fetch_assoc()的彈性。
mysql_fetch_row()的好處是簡單好寫,如果SQL是寫成”SELECT field_a, field_b, …, field_n from table”的形式,程式固定把$row[0], $row[1]放進間接變數,有簡單的好處,比方像這個例子,之後要傳$board到別function裡,但$board一些細項可能從不同table或不同field拿出來的,只要變動SQL,把field的位置放對,之後的程式不用更動:
$board['chinese_name'] = $row[0];
$board['introduction'] = $row[1];
$board[$type] = $row[2];
mysql_fetch_row()另一個好處是取多個table時,同名field不會被擠掉,mysql_fetch_assoc()需要在SQL裡做alias,或是如這篇描述的方法處理,將資料統一包成二維陣列,用$drow[TABLE][FIELD]的方式索引,有點笨重。
mysql_fetch_array()是mysql_fetch_row() + mysql_fetch_assoc()的函式,不多描述,參閱官網就好。
但我就不懂mysql_fetch_object()的優勢在那,google了一下,只有看到這篇在談它,結論是mysql_fetch_object()是廢材,又慢(別篇說的)又難用。記得我初學PHP時,特別愛用mysql_fetch_object(),總覺得用 -> 來索引較清爽,只是單純的OOO病發作罷。bye bye,我曾經的最愛:mysql_fetch_object(),我們因不了解而在一起,又因了解而分開。
ps. OOO:Over Object-Oriented,忽然想到的詞,看起來不錯用 。