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 准备好的语句的主要内容,如果未能解决你的问题,请参考以下文章

将MySQL当中的数据表在PHP当中转换成数组并打印,为什么没有显示到网页上面呢?

PHP从Mysql查出来的数据转换成json格式中文乱码怎么解决

php如何将mysql数据转为数组

mysql如何将字符串转成数组?

代码收藏系列--php--加载sql文件并解析成数组

php怎么将mysql查询的数组中 的(数字)字符串类型转为数字类型