mysqli_num_rows - PHP y MYSQLi-¿Vincula los parámetros usando loop y store in array?
mysqli_fetch_object (3)
Será más fácil explicarlo con el próximo código (está mal, por cierto):
$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 almacena los resultados en una matriz. Pero no está funcionando. ¿Por qué? Creo que porque ''$ genre'' es una matriz, por lo que necesito recorrerla para obtener un valor diferente de ''genreID'' cada vez.
$ género 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, entonces almacena el genreID en una matriz1, y luego repite la matriz $ genre para obtener la genreID para el siguiente valor y almacenarlo de nuevo en array1
¿¿Cómo puedo arreglarlo?? Soy nuevo en la programación así que sea lo más detallado posible. ¡¡Gracias!!
No puede vincular una matriz a un parámetro de SQL. Puede usar un parámetro en SQL en lugar de un único valor literal . No es una lista de valores, o una expresión, o un nombre de columna o tabla.
Para resolver la tarea en su caso, puede usar cualquiera de las dos soluciones:
Primera solución: iterar en $genre
matriz de $genre
, 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 necesita obtener llamadas difíciles bind_param()
con una cantidad variable de argumentos basados en los elementos de su matriz de $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;
}
}
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.
Unas pocas cosas.
- ¿Podría ser porque no sobrescribes el $ género var, intenta cambiarlo a $ genreArray en el caso sedond?
Asegúrate de que la base de datos realmente está devolviendo cosas (pruébalo en phpMyAdmin o algo similar)
Intenta procesar así:
.
$genreId = -1;
$stmt->bind_results($genreId);
$stmt->execute();
while($stmt->fetch()){
$genreArray[] = $genreId;
}
@ Bill Karwin
call_user_func_array no pasará los argumentos por referencia, ¡pasará los valores por lo que no funcionará! le dará error stmt-> bind_param
pdo no es una solución mejor ... todavía tienes que hacer una solución para eso también
esto debe ser editado en tu 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...
}