PHP Conference Japan 2024

mysqli::use_result

mysqli_use_result

(PHP 5, PHP 7, PHP 8)

mysqli::use_result -- mysqli_use_result初始化結果集擷取

說明

物件導向風格

public mysqli::use_result(): mysqli_result|false

程序風格

mysqli_use_result(mysqli $mysql): mysqli_result|false

用於初始化從資料庫連線上使用 mysqli_real_query() 函式執行的最後一個查詢中擷取結果集。

在擷取查詢結果之前,必須呼叫此函式或 mysqli_store_result() 函式,並且必須呼叫其中一個,以防止該資料庫連線上的下一個查詢失敗。

注意事項:

mysqli_use_result() 函式不會從資料庫傳輸整個結果集,因此無法使用 mysqli_data_seek() 等函式移動到集合中的特定列。要使用此功能,必須使用 mysqli_store_result() 儲存結果集。如果在用戶端執行大量處理,則不應使用 mysqli_use_result(),因為這會佔用伺服器資源,並阻止其他執行緒更新正在擷取資料的任何資料表。

參數

此函式沒有參數。

回傳值

傳回一個未緩衝的結果物件,如果發生錯誤則傳回 false

錯誤/例外

如果啟用了 mysqli 錯誤報告 (MYSQLI_REPORT_ERROR) 且請求的操作失敗,則會產生警告。此外,如果模式設定為 MYSQLI_REPORT_STRICT,則會改為擲出 mysqli_sql_exception

範例

範例 #1 mysqli::use_result() 範例

物件導向風格

<?php
$mysqli
= new mysqli("localhost", "my_user", "my_password", "world");

// 檢查連線
if (mysqli_connect_errno()) {
printf("連線失敗: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

// 執行多個查詢
if ($mysqli->multi_query($query)) {
do {
// 儲存第一個結果集
if ($result = $mysqli->use_result()) {
while (
$row = $result->fetch_row()) {
printf("%s\n", $row[0]);
}
$result->close();
}
// 顯示分隔線
if ($mysqli->more_results()) {
printf("-----------------\n");
}
} while (
$mysqli->next_result());
}

// 關閉連線
$mysqli->close();
?>

程序風格

<?php
$link
= mysqli_connect("localhost", "my_user", "my_password", "world");

/* 檢查連線 */
if (mysqli_connect_errno()) {
printf("連線失敗: %s\n", mysqli_connect_error());
exit();
}

$query = "SELECT CURRENT_USER();";
$query .= "SELECT Name FROM City ORDER BY ID LIMIT 20, 5";

/* 執行多重查詢 */
if (mysqli_multi_query($link, $query)) {
do {
/* 儲存第一個結果集 */
if ($result = mysqli_use_result($link)) {
while (
$row = mysqli_fetch_row($result)) {
printf("%s\n", $row[0]);
}
mysqli_free_result($result);
}
/* 顯示分隔線 */
if (mysqli_more_results($link)) {
printf("-----------------\n");
}
} while (
mysqli_next_result($link));
}

/* 關閉連線 */
mysqli_close($link);
?>

以上範例會輸出

my_user@localhost
-----------------
Amersfoort
Maastricht
Dordrecht
Leiden
Haarlemmermeer

另請參閱

新增註解

使用者貢獻的註解 1 則註解

匿名
12 年前
> 如果用戶端需要執行大量處理,則不應使用 mysqli_use_result(),因為這會佔用伺服器資源,並阻止其他執行緒更新正在擷取資料的任何資料表。

理解這種「use_result」方法「阻塞」行為的另一種方式是,使用此方法(或在「query」方法上使用 MYSQLI_USE_RESULT 旗標)時,如果在仍在處理第一個結果集的同時嘗試執行任何種類的第二個查詢(更新、插入、選擇或其他),則第二個查詢將會失敗。 檢查 mysqli->error,您應該會在第二個查詢呼叫中收到「命令不同步」錯誤。

但是,如果您改用「store_result」方法(或在「query」方法上使用預設的 MYSQLI_STORE_RESULT 旗標),則第二個查詢將會順利執行。

為了演示這種「use_result」方法的「阻塞」行為,如果在第 3 行使用「use_result」,則下面第 7 行的第二個查詢將會失敗。

<?php
$mysqli
->real_query('SELECT * FROM `test`');
$query = $mysqli->store_result();
while (
$row = $query->fetch_assoc()) {
$id = (int) $row['id'];
$query2 = $mysqli->query("UPDATE `test` SET `label` = md5(rand()) WHERE `id` = $id");
}
?>
To Top