如果 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();
/* 获取结果集以获取元数据 */
$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);
/* 获取结果集以获取元数据 */
$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() 返回结果对象”,但这可能并不清楚每个人确切地意味着什么。
希望这有帮助。