PHP и 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; } } 

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

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

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

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

Таблица 'genres' содержит два столбца: genreID (INT) и dbGenre (VARCHAR)

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

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

Вы не можете привязать массив к параметру SQL. Вы можете использовать параметр в SQL вместо одного значения литерала . Не список значений, или выражение, или имя столбца или имя таблицы.

Чтобы решить задачу в вашем случае, вы можете использовать любое из двух решений:

Первое решение: цикл над $genre array, привязывать каждое значение по одному и выполнять 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 не передаст 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... } 

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

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

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

,

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