PHP Conference Japan 2024

mysqli_result::fetch_assoc

mysqli_fetch_assoc

(PHP 5, PHP 7, PHP 8)

mysqli_result::fetch_assoc -- mysqli_fetch_assoc將結果集的下一列作為關聯式陣列擷取

說明

物件導向風格

public mysqli_result::fetch_assoc(): 陣列|null|false

程序式風格

mysqli_fetch_assoc(mysqli_result $result): 陣列|null|false

從結果集中擷取一列資料,並將其作為關聯式陣列返回。每次後續呼叫此函式都會返回結果集中的下一列,如果沒有更多列,則返回 null

如果結果的兩個或多個欄位具有相同的名稱,則最後一個欄位將優先並覆蓋任何先前的資料。要存取具有相同名稱的多個欄位,可以使用 mysqli_fetch_row() 來擷取數值索引的陣列,或者可以在 SQL 查詢的 select 清單中使用別名來賦予欄位不同的名稱。

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

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

參數

result

僅限程序式風格:由 mysqli_query()mysqli_store_result()mysqli_use_result()mysqli_stmt_get_result() 返回的 mysqli_result 物件。

返回值

返回一個代表擷取列的關聯式陣列,其中陣列中的每個鍵代表結果集中某個欄位的名稱;如果結果集中沒有更多列,則返回 null;如果失敗,則返回 false

範例

範例 #1 mysqli_result::fetch_assoc() 範例

物件導向風格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = $mysqli->query($query);

/* 擷取關聯式陣列 */
while ($row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

程序式風格

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = mysqli_connect("localhost", "my_user", "my_password", "world");

$query = "SELECT Name, CountryCode FROM City ORDER BY ID DESC";

$result = mysqli_query($mysqli, $query);

/* 提取關聯式陣列 */
while ($row = mysqli_fetch_assoc($result)) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

上述範例會輸出類似以下的內容

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

範例 #2 比較 mysqli_result 迭代器mysqli_result::fetch_assoc() 的用法

mysqli_result 可以使用 foreach 進行迭代。結果集將始終從第一列開始迭代,無論目前位置為何。

<?php

mysqli_report
(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli("localhost", "my_user", "my_password", "world");

$query = 'SELECT Name, CountryCode FROM City ORDER BY ID DESC';

// 使用迭代器
$result = $mysqli->query($query);
foreach (
$result as $row) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

echo
"\n==================\n";

// 不使用迭代器
$result = $mysqli->query($query);
while (
$row = $result->fetch_assoc()) {
printf("%s (%s)\n", $row["Name"], $row["CountryCode"]);
}

以上範例的輸出結果類似如下:

Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

==================
Pueblo (USA)
Arvada (USA)
Cape Coral (USA)
Green Bay (USA)
Santa Clara (USA)

另請參閱

新增筆記

使用者貢獻的筆記 3 則筆記

Miller
11 年前
我經常喜歡將我的結果以陣列的格式發送到其他地方(儘管請記住,如果您只是計劃在腳本的其他部分遍歷陣列,那麼這個額外的步驟只是浪費時間)。

這是我的單行程式碼,用於將 mysqli_result 集合轉換為陣列。
<?php
$sql
= new MySQLi($host, $username, $password, $database);

$result = $sql->query("SELECT * FROM `$table`;");
for (
$set = array (); $row = $result->fetch_assoc(); $set[] = $row);
print_r($set);
?>

輸出
陣列
(
[0] => 陣列
(
[id] => 1
[field2] => a
[field3] => b
),
[1] => 陣列
(
[id] => 2
[field2] => c
[field3] => d
)
)

我使用其他變體來適應情況,例如,如果我只選擇一個欄位
<?php
$sql
= new MySQLi($host, $username, $password, $database);
$result = $sql->query("SELECT `field2` FROM `$table`;");
for (
$set = array (); $row = $result->fetch_assoc(); $set[] = $row['field2']);
print_r($set);
?>
輸出
陣列
(
[0] => a
[1] => c
)

或者,要使陣列與主索引相關聯(程式碼假設主索引是表格中的第一個欄位)
<?php
$sql
= new MySQLi($host, $username, $password, $database);
$result = $sql->query("SELECT * FROM `$table`;");
for (
$set = array (); $row = $result->fetch_assoc(); $set[array_shift($row)] = $row);
print_r($set);
?>
輸出
陣列
(
[1] => 陣列
(
[field2] => a
[field3] => b
),
[2] => 陣列
(
[field2] => c
[field3] => d
)
)
james dot phx at gmail dot com
13 年前
重要注意事項

如果您習慣使用如下程式碼:

<?php
while(false !== ($row = mysql_fetch_assoc($result)))
{
//...
}
?>

您必須將其更改為以下程式碼才能使用 mysqli:

<?php
while(null !== ($row = mysqli_fetch_assoc($result)))
{
//...
}
?>

前者的程式碼會導致您的腳本持續運行,直到達到 max_execution_time 設定值。
Enrique Garcia
1 年前
MariaDB 和 MySQL(>5.4) 之間存在差異,差異在於輸入參數(mysqli 物件)是否包含數據或為空(來自先前的查詢)。
-MariaDB:您會收到例外
嚴重錯誤:未捕獲的 TypeError:mysqli_fetch_assoc():參數 #1 ($result) 必須是 mysqli_result 類型
-MySQL:即使 mysqli 物件中沒有數據,您也可以繼續執行。
To Top