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 个备注

匿名
11 年前
> 如果在客户端执行大量处理,则不应使用 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