mysqli_stmt返回结果对象

时间:2011-04-13 10:12:44

标签: php mysql mysqli

使用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);

有没有办法实现这个目标?感谢

更新
get_result函数正是我所需要的,但它不适用于我的PHP

4 个答案:

答案 0 :(得分:1)

好吧,如果您不想使用mysqli_stmt::fetch()mysqli_result::fetch_*(),我想这会有点麻烦。

http://www.joekolba.com/node/2

或者,使用PDO

答案 1 :(得分: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的事实;)

答案 2 :(得分: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

答案 3 :(得分:-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();
}