mysqli_stmt 返回结果对象

问题描述 投票:0回答:3

使用

mysqli_stmt::prepare()
execute()
查询时,不会返回结果集。但我们需要使用 stmt 对象上的
mysqli_stmt:fetch()
进行访问。 php手册中有一个名为
mysqli_stmt::get_result()
的函数,它将返回结果集到我们定义的变量中,但是当我使用它时,它给了我未定义的方法错误。手册上说它可能是在 SVC 中,但我不确定是什么。

代码:

$conn = new mysqli(DB_HOST,DB_USERNAME,DB_PASSWORD, DB_NAME);
$stmt =  $conn->stmt_init();
$stmt->prepare("select * from users where u_id = ? ");
$stmt->bind_param('s', $param);
$stmt->execute();

我知道我可以使用

bind_result()
fetch()
函数来检索记录,例如:

$stmt->bind_result($column1, $column2, $column3);

while ($stmt->fetch()) {
    echo "Column 1: $column1\n";
    echo "Column 2: $column2\n";
    echo "Column 3: $column3\n";
}

但是,我的目标是在执行后获取结果集(资源类型对象),如下所示:

$result = $stmt->execute();

这样我就可以在结果集上使用正常的

mysqli::fetch_object

$conn->fetch_object($result);

有什么办法可以实现这个目标吗?

php mysqli
3个回答
0
投票

我是按照以下方式完成的:

$stmt->prepare("select * from users where u_id = ? ");
$stmt->bind_param('s', $param);
$stmt->execute();

$stmt->bind_result($columns['column_name1'], $columns['column_name2'], $columns['column_name3']);

while ($stmt->fetch()) {
  $row = (object) $columns;
}

这非常接近 FETCH_OBJECT 方法。您可以通过 $row->column_name1 等访问一行的所有数据。当然,当您更改表并更改名称时,您必须更新关联的列数组。但它对我来说效果很好。不想切换到 PDO - 考虑到我几天前才切换到 MYSQLi ;)


0
投票

要启用 mysqli_stmt::get_result() 方法,您需要使用 mysqlnd (MySQL Native Driver) 扩展:http://php.net/manual/en/book.mysqlnd.php

由于某种原因,这个具体方法没有用更常用的 libmysqlclient 来实现。在我的 debian 服务器(以及我的 ubuntu 桌面)中,这相当于运行:

sudo apt-get install php5-mysqlnd

-1
投票

您需要调用

bind_result
来告诉 mysqli 哪些变量应该保存这些列。然后每次调用 fetch 时,这些变量都会自动填充,您可以像平常一样访问它们。请参阅下面的代码(不确定是否有效,ymmv)。

$conn = new mysqli(DB_HOST,DB_USERNAME,DB_PASSWORD, DB_NAME);

if($stmt = $conn->prepare('select * from users where u_id = ?'))
{
    $stmt->bind_param("s", $param);
    $stmt->execute();
    $stmt->bind_result($column1, $column2, $column3);

    while ($stmt->fetch()) {
        echo "Column 1: $column1\n";
        echo "Column 2: $column2\n";
        echo "Column 3: $column3\n";
    }

    $stmt->close();
}
© www.soinside.com 2019 - 2024. All rights reserved.