bind_result到数组 PHP mysqli 预准备语句中

2022-08-31 01:07:51

想知道如何将PHP预准备语句的结果绑定到数组中,然后如何调用它们。例如,此查询

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

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


答案 1

PHP 5.3 引入了 mysqli_stmt::get_result,它返回一个结果集对象。然后,您可以调用 mysqli_result::fetch_array()mysqli_result::fetch_assoc()。但是,它仅适用于本机MySQL驱动程序。


答案 2

经验法则是,当结果中有多个列时,应使用 and 或 。这些是旨在将结果提取为数组的函数。get_result()fetch_array()fetch_all()

的目的是分别绑定每列。每列应绑定到一个变量引用。当然,它不是很有用,但在极少数情况下它可能会派上用场。一些旧版本的PHP甚至没有.bind_result()get_result()

如果您无法使用,并且仍然想将多个列提取到数组中,则需要执行一些操作来取消引用这些值。这意味着给他们一个新的zval容器。我能想到的唯一方法是使用循环。get_result()

$data = [];
$q->bind_result($data["category_name"], $data["id"]);
while ($q->fetch()) {
    $row = [];
    foreach ($data as $key => $val) {
        $row[$key] = $val;
    }
    $array[] = $row;
}

PHP手册注释中提到的另一种解决方案是 使用 ,这在内部将执行相同的操作,但在一行中使用匿名函数。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);