经验法则是,当结果中有多个列时,应使用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);