bind_result成为一个PHP mysqli编写的数组语句

时间:2010-12-21 07:13:54

标签: php arrays mysqli prepared-statement

想知道如何将PHP预处理语句的结果绑定到数组中,然后我如何调用它们。例如这个查询

$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();

这将返回用户名,电子邮件和ID的结果。想知道我是否可以将它绑定在数组中,然后将其存储在变量中,以便我可以在整个页面中调用它?

4 个答案:

答案 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);