bind_result 成数组 PHP mysqli 准备好的语句
Posted
技术标签:
【中文标题】bind_result 成数组 PHP mysqli 准备好的语句【英文标题】:bind_result into an array PHP mysqli prepared statement 【发布时间】:2011-05-28 16:11:17 【问题描述】:想知道如何将 php 准备语句的结果绑定到一个数组中,然后如何调用它们。例如这个查询
$q = $DBH->prepare("SELECT * FROM users WHERE username = ?");
$q->bind_param("s", $user);
$q->execute();
这将返回用户名、电子邮件和 ID 的结果。想知道我是否可以将它绑定到一个数组中,然后将它存储在一个变量中,以便我可以在整个页面中调用它?
【问题讨论】:
写在docs 具体来说,这里:php.net/manual/en/mysqli-stmt.bind-result.php#92505 您可以将其发布为答案,以便我将其标记为正确。 【参考方案1】:PHP 5.3 引入了mysqli_stmt::get_result,它返回一个结果集对象。然后您可以致电mysqli_result::fetch_array() 或 mysqli_result::fetch_assoc()。不过,它仅适用于本机 MySQL 驱动程序。
【讨论】:
【参考方案2】:经验法则是,当结果中有多个列时,应使用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);
【讨论】:
【参考方案3】:有关如何使用 bind_result()
而不是 get_result()
循环遍历结果集并将每一行的值存储在数字索引数组中的示例,请参阅 Call to undefined method mysqli_stmt::get_result。
【讨论】:
以上是关于bind_result 成数组 PHP mysqli 准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章
如何在 php 中使用 bind_result() 而不是 get_result()
mysqli_stmt::bind_result():绑定变量的数量与准备好的语句中的字段数量不匹配