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!

¿Fue útil?

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;
 }
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top