使用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
答案 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();
}