PHP和MYSQLi - 使用循环和存储在数组中绑定参数?

时间:2009-03-09 19:56:00

标签: php mysql database arrays mysqli

使用下一个代码更容易解​​释(顺便说一下,这是错误的):

        $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();
        $genre = array();
            while ($stmt->fetch()) {
                $genre[] = $genres;
            }
        }

当'dbGenre'等于'$ genre'时,上面的代码从'genreID'获取值。然后将结果存储在一个数组中。但我不行。为什么?我认为因为'$ genre'是一个数组,所以我需要循环它以便每次从'genreID'获得不同的值。

$ genre是一个包含电影类型的枚举数组,例如:

[0] =>行动[1] =>冒险[2] =>幻想

我需要比较de值(比如'Action')

'genres'表包含两列: genreID(INT) dbGenre(VARCHAR)

我只需要每个genreID(这是一个数字)....让我们说..当dbGenre等于Action时,然后将genreID存储在array1中,然后循环$ genre数组以获取genreID为下一个值并将其再次存储在array1

我该如何解决?我是编程的新手,所以请尽可能详细。谢谢!

3 个答案:

答案 0 :(得分:8)

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

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

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

if ($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), '?')) . ')';

if ($stmt->prepare($selectGenre_sql)) {
  $genre = array();
  . . .

另外,你需要根据bind_param()数组中的元素,使用可变数量的参数调用$genre棘手:

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

  $stmt->execute();

  $stmt->bind_result($genres);

  while ($stmt->fetch()) {
    $genre[] = $genres;
  }
}

您可能需要考虑使用PDO::mysql,因为从阵列中绑定参数更容易。对于这种情况,MySQLi接口非常尴尬。

答案 1 :(得分:3)

@ Bill Karwin

call_user_func_array不会通过引用传递args,它会传递值,所以不会工作!它会给你stmt-> bind_param错误

pdo它不是一个更好的解决方案......你仍然需要为此做一个解决方法

这应该在你的帖子中编辑:

if($stmt = ...same as yours) {
array_unshift($genre, str_repeat('i', count($genre)));
$temp = array();
foreach($genre as $key => $value) {
    $temp[$key] = &$genre[$key];
}
call_user_func_array(array($stmt, 'bind_param'), $temp);
etc...
}

答案 2 :(得分:0)

一些事情。

  • 难道不是因为你覆盖了$ genre var,试着在sedond的情况下把它改成$ genreArray吗?
  • 确保数据库实际返回的内容(在phpMyAdmin或类似内容中尝试)

  • 尝试这样处理:

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