PHP y MYSQLi: ¿enlazar los parámetros usando el bucle y almacenar en una matriz?
Pregunta
Será más fácil de explicar con el siguiente código (por cierto, está mal):
$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;
}
}
El código anterior obtiene el valor de 'genreID' cuando 'dbGenre' es igual a '$ género'. Y luego almacene los resultados en una matriz. Pero no estoy trabajando. ¿Por qué? Creo que porque '$ genre' es una matriz, por lo que necesito recorrerlo para obtener un valor diferente de 'genreID' cada vez.
$ genere es una matriz enumerada que contiene géneros de películas, por ejemplo:
[0] = > Acción [1] = > Aventura [2] = > Fantasía
Necesito comparar el valor (como 'Acción' por ejemplo)
La tabla 'géneros' contiene dos columnas: genreID (INT) y dbGenre (VARCHAR)
Solo necesito cada genreID (que es un número) ... Digamos que ... cuando dbGenre es igual a Action, luego almacena el genreID en un array1, y luego repite el $ genre array para obtener el ID de género para el siguiente valor y almacenarlo nuevamente en array1
¿Cómo puedo solucionarlo? Soy nuevo en la programación, así que por favor sea lo más detallado posible. ¡Gracias!
Solución
No puede vincular una matriz a un parámetro SQL. Puede usar un parámetro en SQL en lugar de un valor literal único . No es una lista de valores, o una expresión, o un nombre de columna o nombre de tabla.
Para resolver la tarea en su caso, puede usar cualquiera de las dos soluciones:
Primera solución: recorrer la matriz $ genere
, vincular cada valor de uno en uno y ejecutar la consulta SQL para cada valor.
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;
}
}
}
Segunda solución: ejecutar la consulta una vez, con múltiples parámetros, uno para cada valor en la matriz. Esto requiere un código complicado para construir un número variable de marcadores de posición ?
en la consulta SQL, separados por comas.
$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN ('
. join(',', array_fill(0, count($genre), '?')) . ')';
if ($stmt->prepare($selectGenre_sql)) {
$genre = array();
. . .
También debe ser complicado llamar a bind_param ()
con un número variable de argumentos basados ??en los elementos de su matriz $ genere
:
. . .
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;
}
}
Es posible que desee considerar el uso de PDO :: mysql
porque es más fácil vincular parámetros de una matriz. La interfaz MySQLi es bastante incómoda para este caso.
Otros consejos
@ Bill Karwin
call_user_func_array no pasará los argumentos por referencia, pasará los valores, ¡así que no funcionará! le dará error stmt- > bind_param
pdo no es una mejor solución ... todavía tienes que hacer una solución para eso también
esto debe editarse en su publicación:
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...
}
Algunas cosas.
- ¿Podría ser porque no está sobrescribiendo la variable $ genere, intente cambiarla a $ genreArray en el caso sedond?
-
Asegúrese de que la base de datos está devolviendo cosas (pruébelo en phpMyAdmin o algo similar)
-
Intente procesar de esta manera:
.
$genreId = -1;
$stmt->bind_results($genreId);
$stmt->execute();
while($stmt->fetch()){
$genreArray[] = $genreId;
}