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