使用
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);
有什么办法可以实现这个目标吗?
我是按照以下方式完成的:
$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 ;)
要启用 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
您需要调用
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();
}