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] => Фэнтези
Мне нужно сравнить значение (например, «Действие»)
Таблица «жанры» содержит два столбца: идентификатор жанра (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;
}