想知道如何将PHP预处理语句的结果绑定到数组中,然后我如何调用它们。例如这个查询
$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();
这将返回用户名,电子邮件和ID的结果。想知道我是否可以将它绑定在数组中,然后将其存储在变量中,以便我可以在整个页面中调用它?
答案 0 :(得分:13)
PHP 5.3引入了mysqli_stmt::get_result,它返回一个结果集对象。然后,您可以拨打mysqli_result::fetch_array()或 mysqli_result::fetch_assoc()。但它仅适用于本机MySQL驱动程序。
答案 1 :(得分:5)
具体来说,这里:http://php.net/manual/en/mysqli-stmt.bind-result.php#92505 - cbrandolino
答案 2 :(得分:1)
有关如何使用bind_result()
而不是get_result()
循环遍历结果集并将数据存储在数字索引数组中的每一行的示例,请参阅Call to undefined method mysqli_stmt::get_result。
答案 3 :(得分:1)
经验法则是,如果结果中有多列,则应使用get_result()
和fetch_array()
或fetch_all()
。这些是旨在将结果作为数组获取的函数。
bind_result()
的目的是分别绑定每列。每一列应绑定到一个变量引用。当然,它不是很有用,但在极少数情况下可能会派上用场。一些旧版本的PHP甚至没有get_result()
。
如果您不能使用get_result()
,但仍想将多个列提取到数组中,则需要做一些事来取消引用值。这意味着给他们一个新的zval容器。我能想到的唯一方法是使用循环。
$data = [];
$q->bind_result($data["category_name"], $data["id"]);
while ($q->fetch()) {
$row = [];
foreach ($data as $key => $val) {
$row[$key] = $val;
}
$array[] = $row;
}
the comments in PHP manual中提到的另一种解决方案是使用array_map
,该方法内部将执行相同的操作,但是使用匿名函数在一行中进行。
while ($q->fetch()) {
$array[] = array_map(fn($a) => $a , $data);
}
以上两种解决方案都具有与以下相同的效果:
$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();
$result = $q->get_result();
$array = $result->fetch_all(MYSQLI_ASSOC);