2024 年日本 PHP 研討會

mysql_fetch_array

(PHP 4, PHP 5)

mysql_fetch_array將結果列擷取為關聯式陣列、數字索引陣列或兩者

警告

此擴充功能已於 PHP 5.5.0 中棄用,並於 PHP 7.0.0 中移除。建議改用 MySQLiPDO_MySQL 擴充功能。另請參閱 MySQL:選擇 API 指南。此函式的替代方案包括:

說明

mysql_fetch_array(資源 $result, int $result_type = MYSQL_BOTH): 陣列

返回對應於擷取列的陣列,並將內部資料指標向前移動。

參數

result

正在評估的結果 資源。此結果來自對 mysql_query() 的呼叫。

result_type

要擷取的陣列類型。它是一個常數,可以採用下列值:MYSQL_ASSOCMYSQL_NUMMYSQL_BOTH

返回值

返回對應於擷取列的字串陣列,如果沒有更多列,則返回 false。返回陣列的類型取決於 result_type 的定義方式。使用 MYSQL_BOTH(預設值),您將獲得同時具有關聯式和數字索引的陣列。使用 MYSQL_ASSOC,您只會獲得關聯式索引(如同 mysql_fetch_assoc() 的運作方式),使用 MYSQL_NUM,您只會獲得數字索引(如同 mysql_fetch_row() 的運作方式)。

如果結果的兩個或多個欄位具有相同的欄位名稱,則最後一個欄位將優先。要存取同名的其他欄位,您必須使用欄位的數字索引或為欄位建立別名。對於別名欄位,您無法使用原始欄位名稱存取內容。

範例

範例 #1 使用別名重複欄位名稱的查詢

SELECT table1.field AS foo, table2.field AS bar FROM table1, table2

範例 #2 使用 MYSQL_NUMmysql_fetch_array()

<?php
mysql_connect
("localhost", "mysql_user", "mysql_password") or
die(
"無法連線: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while (
$row = mysql_fetch_array($result, MYSQL_NUM)) {
printf("ID: %s 姓名: %s", $row[0], $row[1]);
}

mysql_free_result($result);
?>

範例 #3 使用 MYSQL_ASSOCmysql_fetch_array()

<?php
mysql_connect
("localhost", "mysql_user", "mysql_password") or
die(
"無法連線: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while (
$row = mysql_fetch_array($result, MYSQL_ASSOC)) {
printf("ID: %s 姓名: %s", $row["id"], $row["name"]);
}

mysql_free_result($result);
?>

範例 #4 使用 MYSQL_BOTHmysql_fetch_array()

<?php
mysql_connect
("localhost", "mysql_user", "mysql_password") or
die(
"無法連線: " . mysql_error());
mysql_select_db("mydb");

$result = mysql_query("SELECT id, name FROM mytable");

while (
$row = mysql_fetch_array($result, MYSQL_BOTH)) {
printf ("ID: %s 姓名: %s", $row[0], $row["name"]);
}

mysql_free_result($result);
?>

注意事項

注意效能

需要注意的重要一點是,使用 mysql_fetch_array() 並不會比使用 mysql_fetch_row() 慢多少,卻提供了顯著的附加價值。

注意此函式返回的欄位名稱區分大小寫

注意此函式會將 NULL 欄位設定為 PHP null 值。

另請參閱

新增註記

使用者貢獻的註記 12 則註記

17
robjohnson at black-hole dot com
22 年前
在一個包含 38567 列的表格上進行基準測試

mysql_fetch_array
MYSQL_BOTH:6.01940000057 秒
MYSQL_NUM:3.22173595428 秒
MYSQL_ASSOC:3.92950594425 秒

mysql_fetch_row:2.35096800327 秒
mysql_fetch_assoc:2.92349803448 秒

如您所見,擷取陣列或雜湊的效率是擷取兩者的兩倍。使用 fetch_row 比傳遞 fetch_array MYSQL_NUM 還要快,或者使用 fetch_assoc 比 fetch_array MYSQL_ASSOC 還要快。除非真的需要,否則不要擷取 BOTH,而且大多數時候你並不需要。
8
KingIsulgard
16 年前
我找到一種方法可以將 select 查詢的所有結果用一行放進陣列中。

// 讀取記錄
$result = mysql_query("SELECT * FROM table;") or die(mysql_error());

// 將它們放入陣列
for($i = 0; $array[$i] = mysql_fetch_assoc($result); $i++);

// 刪除最後一個空的元素
array_pop($array);

您需要刪除最後一個元素,因為它永遠是空的。

透過這種方式,您可以輕鬆地將整個資料表讀取到一個陣列中,並保留資料表欄位的鍵值。 非常方便。
-4
puzbie at facebookanswers dot co dot uk
13 年前
<?php
while($r[]=mysql_fetch_array($sql));
?>

是的,這會產生一個虛擬的陣列元素,其中包含最後一個 mysql_fetch_array 的 false 值。 您應該截斷陣列,或者(在我看來更合理)在將 mysql_fetch_array 的結果添加到陣列之前檢查它是否為 false。
-3
info at o08 dot com
15 年前
與 mysql_fetch_array 相反

<?php
function mysql_insert_array ($my_table, $my_array) {
$keys = array_keys($my_array);
$values = array_values($my_array);
$sql = 'INSERT INTO ' . $my_table . '(' . implode(',', $keys) . ') VALUES ("' . implode('","', $values) . '")';
return(
mysql_query($sql));
}
#http://www.weberdev.com/get_example-4493.html
?>
-5
final at skilled dot ch
13 年前
當我產生動態查詢,然後必須判斷我的結果集是否包含特定欄位時,我遇到了 MySQL NULL 值的麻煩。

第一直覺是使用 isset() 和 is_null(),但這些函式的行為可能與您的預期不同。

我最後使用了 array_key_exists,因為它是唯一可以告訴我鍵值是否存在之函式。

<?php
$row
= mysql_fetch_assoc(mysql_query("SELECT null as a"));
var_dump($row); //array(1) { ["a"]=> NULL }
var_dump(isset($row['a'])); //false
var_dump(isset($row['b'])); //false
var_dump(is_null($row['a'])); //true
var_dump(is_null($row['b'])); //true + 拋出未定義索引通知
var_dump(array_key_exists('a', $row)); // true
var_dump(array_key_exists('b', $row)); // false
?>
-4
john at skem9 dot com
18 年前
我的主要目的是將擷取的陣列顯示在表格中,將結果並排顯示而不是垂直顯示,以下是我想到的解決方法。

只需將 $display 數字更改為您想要的欄數,不要更改 $cols 數字,否則可能會遇到一些問題。

<?php
$display
= 4;
$cols = 0;
echo
"<table>";
while(
$fetched = mysql_fetch_array($result)){
if(
$cols == 0){
echo
"<tr>\n";
}
// 在這裡放入您想要在每個儲存格中顯示的內容
echo "<td>".$fetched['id']."<br />".$fetched['name']."</td>\n";
$cols++;
if(
$cols == $display){
echo
"</tr>\n";
$cols = 0;
}
}
// 添加以下內容以便顯示正確的 html
if($cols != $display && $cols != 0){
$neededtds = $display - $cols;
for(
$i=0;$i<$neededtds;$i++){
echo
"<td></td>\n";
}
echo
"</tr></table>";
} else {
echo
"</table>";
}
?>

希望這可以為你們一些人省去很多搜尋時間。

任何改進都將非常棒!
-4
kunky at mail dot berlios dot de
19 年前
當使用以下查詢時,這非常有用

`SHOW TABLE STATUS`

不同版本的 MySQL 對此會有不同的回應。

因此,最好使用 mysql_fetch_array(),因為 mysql_fetch_row() 提供的數字索引會產生非常不同的結果。
-5
匿名
13 年前
如果我使用

<?php
while($r[]=mysql_fetch_array($sql));
?>

那麼在陣列 $r 中,會比資料庫返回的列數多一個項目。
-5
barbieri at NOSPAMzero dot it
22 年前
以下是一個解決 NULL 值問題的建議

// 取得關聯式陣列,並設定 NULL 值
$record = mysql_fetch_array($queryID,MYSQL_ASSOC);

// 設定數字索引
if(is_array($record))
{
$i = 0;
foreach($record as $element)
$record[$i++] = $element;
}

這樣你就可以像往常一樣訪問 $result 陣列,並且 NULL 欄位也會被設定。
-5
joelwan at gmail dot com
19 年前
試試 Php 物件產生器: http://www.phpobjectgenerator.com

它有點類似於上面其中一則留言建議的 Daogen,但更簡單易用。

Php 物件產生器會為你的 Php 物件產生 Php 類別。 它還提供了資料庫類別,因此你可以專注於專案中更重要的方面。希望這有幫助。
-5
tim at wiltshirewebs dot com
19 年前
以下是用 4 行程式碼複製或克隆記錄到同一個表格的快速方法

// 首先,取得最高的 ID 號碼,以便我們計算複製記錄的新 ID 號碼
// 第二,取得原始實體
// 第三,將複製記錄的 ID 增加到比最大值大 1
// 最後插入新記錄 - 就這樣 - 4 行!

$id_max = mysql_result(mysql_query("SELECT MAX(id) FROM table_name"),0,0) or die("無法執行查詢");
$entity = mysql_fetch_array(mysql_query("SELECT * FROM table WHERE id='$id_original'"),MYSQL_ASSOC) or die("無法選擇原始記錄"); // MYSQL_ASSOC 強制使用純關聯式陣列並阻止雙鍵重複,至關重要的是,它會顯示鍵,以便它們可以在第 4 行中使用
$entity["id"]=$id_max+1;
mysql_query("INSERT INTO it_pages (".implode(", ",array_keys($Entity)).") VALUES ('".implode("', '",array_values($Entity))."')");

真的很難解決這個問題 - 也許有更簡單的方法?感謝其他發帖者提供的靈感。祝你好運 - Tim
-5
some at gamepoint dot net
22 年前
我從來沒有遇到這麼多關於空欄位的問題,但我的理解是,extract 只有在使用關聯式陣列時才能按預期工作,就像前一個註釋中使用的 mysql_fetch_assoc() 那樣。

然而,mysql_fetch_array 將返回帶有數字和關聯式鍵的欄位值,數字鍵是 extract() 無法很好處理的。
您可以透過呼叫 mysql_fetch_array($result, MYSQL_ASSOC) 來避免這個問題,它會返回與 mysql_fetch_assoc 相同的結果,並且與 extract() 函式相容。
To Top