Это будет проще объяснить с помощью следующего кода (кстати, это неправильно):
$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... }
Несколько вещей.
Убедитесь, что база данных фактически возвращает вещи (попробуйте в 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; }