PHP и MYSQLi – привязать параметры с помощью цикла и сохранить в массиве?

StackOverflow https://stackoverflow.com/questions/627763

Вопрос

Это будет проще объяснить с помощью следующего кода (кстати, он неправильный):

        $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;
            }
        }

Приведенный выше код получает значение из «genreID», когда «dbGenre» равно «$genre».А затем сохраните результаты в массиве.Но я не работаю.Почему?Я думаю, потому что «$genre» — это массив, поэтому мне нужно пройти через него, чтобы каждый раз получать другое значение из «genreID».

$genre — перечислимый массив, содержащий жанры фильмов, например:

[0] => Действие [1] => Приключение [2] => Фэнтези

Мне нужно сравнить значение (например, «Действие»)

Таблица «жанры» содержит два столбца: идентификатор жанра (INT) и дбжанр (VARCHAR)

Мне просто нужен каждый идентификатор жанра (это число)....Допустим..когда dbGenre равен Action, затем сохраните идентификатор жанра в массиве1, а затем зациклите массив $genre, чтобы получить идентификатор жанра для следующего значения, и снова сохраните его в массиве1.

Как я могу это исправить??Я новичок в программировании, поэтому, пожалуйста, будьте как можно подробнее.Спасибо!!

Это было полезно?

Решение

Вы не можете связать массив с параметром 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 довольно неудобен для этого случая.

Другие советы

@ Билл Карвин

call_user_func_array не будет передавать аргументы по ссылке, он будет передавать значения, поэтому он не будет работать! это даст вам ошибку stmt-> gind_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...
}

Несколько вещей.

  • Может быть, это не потому, что вы перезаписываете переменную $genre, попробуйте изменить ее на $genreArray во втором случае?
  • Убедитесь, что база данных действительно возвращает данные (попробуйте это в phpMyAdmin или чем-то подобном).

  • Попробуйте обработать так:

.

 $genreId = -1;
 $stmt->bind_results($genreId);
 $stmt->execute();
 while($stmt->fetch()){
  $genreArray[] = $genreId;
 }
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top