如何使用循环绑定mysqli参数并将结果存储在数组中?

Posted

技术标签:

【中文标题】如何使用循环绑定mysqli参数并将结果存储在数组中?【英文标题】:How to bind mysqli parameters using loop and store results in array? 【发布时间】:2010-10-12 06:46:39 【问题描述】:
$genre = array(
    'Action',
    'Adventure',
    'Fantasy'
);
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre = ?';

if ($stmt->prepare($selectGenre_sql)) 
    // bind the query parameters
    $stmt->bind_param('s', $genre);
    // bind the results to variables
    $stmt->bind_result($genres);
    // execute the query
    $stmt->execute();
    $array1 = array();
    while ($stmt->fetch()) 
        $array1[] = $genres;
    

dbGenre 等于$genre 时,上面的代码从genreID 获取值。然后将结果存储在一个数组中。但它不起作用,因为$genre 是一个数组,所以我需要循环遍历它以每次从genreID 获取不同的值。

“流派”表包含两列:genreID (INT)dbGenre (VARCHAR)

我只需要每个genreID(即一个数字)...假设当dbGenre 等于Action 时,然后将genreID 存储在array1 中,然后循环$genre 数组以获得下一个值的genreID 和再次将其存储在array1中。

我该如何解决?

【问题讨论】:

【参考方案1】:

您不能将数组绑定到 SQL 参数。您可以在 SQL 中使用参数来代替 单个文字值。不是值列表、表达式、列名或表名。

要解决您的任务,您可以使用以下两种解决方案之一:

第一个解决方案:循环$genre数组,一次绑定每个值,并为每个值执行SQL查询。

$stmt->prepare($selectGenre_sql);
$genre = array();
foreach ($gengre as $genreID) 
    $stmt->bind_param('s', $genreID);
    $stmt->execute();
    $stmt->bind_result($genres);
    while ($stmt->fetch()) 
        $genre[] = $genres;
    

第二种解决方案:执行一次查询,带有多个参数,数组中的每个值一个。这需要一些棘手的代码来在 SQL 查询中构建可变数量的 ? 占位符,用逗号分隔。

$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN ('
 . join(',', array_fill(0, count($genre), '?')) . ')';

此外,您还需要根据 $genre 数组中的元素使用可变数量的参数调用 bind_param()

$stmt->prepare($selectGenre_sql);
$temp = array();
foreach ($genre as $key => $value) 
    $temp[] = &$genre[$key];


array_unshift($genre, str_repeat('i', count($genre)));
call_user_func_array(array($stmt, 'bind_param'), $genre);

$stmt->execute();

$stmt->bind_result($genres);

$array1 = array();
while ($stmt->fetch()) 
    $array1[] = $genres;

您可能要考虑使用PDO_mysql,因为它更容易从数组中绑定参数。对于这种情况,MySQLi 界面非常尴尬。

【讨论】:

【参考方案2】:

一些事情。

难道不是因为您覆盖了 $genre var,尝试在第二种情况下将其更改为 $genreArray 吗?

确保数据库确实在返回东西(在 phpMyAdmin 或类似的东西中尝试)

尝试如下处理:

.

 $genreId = -1;
 $stmt->bind_results($genreId);
 $stmt->execute();
 while($stmt->fetch())
  $genreArray[] = $genreId;
 

【讨论】:

我只需要每个genreID(即一个数字)....可以说..当dbGenre等于Action时,将genreID存储在数组中,然后循环获取genreID下一个数组值..

以上是关于如何使用循环绑定mysqli参数并将结果存储在数组中?的主要内容,如果未能解决你的问题,请参考以下文章

mySqli 使用通配符绑定参数 LIKE

如何使用索引号将数据发送到mysqli(准备好的语句)

有没有办法将数组绑定到mysqli准备[重复]

如何在 PHP 中动态绑定 mysqli bind_param 参数?

如何在 PHP 中动态绑定 mysqli bind_param 参数?

获取mysqli结果时如何在while循环内抛出异常?