如果 result_metadata() 返回 false,但 error/errno/sqlstate 指示没有发生错误,这意味着您的查询不会生成结果集,即 INSERT/UPDATE/DELETE 查询而不是 SELECT 查询。
文档中已说明“如果传递给 mysqli_prepare() 的语句会生成结果集,mysqli_stmt_result_metadata() 将返回结果对象”,但这可能对并非每个人都清楚这意味着什么。
希望这有帮助。
(PHP 5, PHP 7, PHP 8)
mysqli_stmt::result_metadata -- mysqli_stmt_result_metadata — 返回预处理语句的结果集元数据
面向对象风格
过程化风格
如果传递给 mysqli_prepare() 的语句会生成结果集,mysqli_stmt_result_metadata() 将返回结果对象,该对象可用于处理元信息,例如字段总数和单个字段信息。
注意:
此结果集指针可以作为参数传递给任何处理结果集元数据的基于字段的函数,例如:
完成后应释放结果集结构,可以通过将其传递给 mysqli_free_result() 来实现。
注意:
mysqli_stmt_result_metadata() 返回的结果集仅包含元数据。它不包含任何行结果。行结果是使用语句句柄和 mysqli_stmt_fetch() 获取的。
返回结果对象或false
(如果发生错误)。
如果启用了 mysqli 错误报告 (MYSQLI_REPORT_ERROR
) 并且请求的操作失败,则会生成警告。此外,如果模式设置为MYSQLI_REPORT_STRICT
,则会抛出 mysqli_sql_exception 异常。
示例 #1 面向对象风格
<?php
$mysqli = new mysqli("localhost", "my_user", "my_password", "test");
$mysqli->query("DROP TABLE IF EXISTS friends");
$mysqli->query("CREATE TABLE friends (id int, name varchar(20))");
$mysqli->query("INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");
$stmt = $mysqli->prepare("SELECT id, name FROM friends");
$stmt->execute();
/* 获取元数据的resultset */
$result = $stmt->result_metadata();
/* 从元数据结果集中检索字段信息 */
$field = $result->fetch_field();
printf("Fieldname: %s\n", $field->name);
/* 关闭结果集 */
$result->close();
/* 关闭连接 */
$mysqli->close();
?>
示例 #2 过程化风格
<?php
$link = mysqli_connect("localhost", "my_user", "my_password", "test");
mysqli_query($link, "DROP TABLE IF EXISTS friends");
mysqli_query($link, "CREATE TABLE friends (id int, name varchar(20))");
mysqli_query($link, "INSERT INTO friends VALUES (1,'Hartmut'), (2, 'Ulf')");
$stmt = mysqli_prepare($link, "SELECT id, name FROM friends");
mysqli_stmt_execute($stmt);
/* 获取元数据的resultset */
$result = mysqli_stmt_result_metadata($stmt);
/* 从元数据结果集中检索字段信息 */
$field = mysqli_fetch_field($result);
printf("Fieldname: %s\n", $field->name);
/* 关闭结果集 */
mysqli_free_result($result);
/* 关闭连接 */
mysqli_close($link);
?>
如果 result_metadata() 返回 false,但 error/errno/sqlstate 指示没有发生错误,这意味着您的查询不会生成结果集,即 INSERT/UPDATE/DELETE 查询而不是 SELECT 查询。
文档中已说明“如果传递给 mysqli_prepare() 的语句会生成结果集,mysqli_stmt_result_metadata() 将返回结果对象”,但这可能对并非每个人都清楚这意味着什么。
希望这有帮助。