2009-03-09 16 views
5

Será más fácil de explicar con el siguiente código (que está mal, por cierto):PHP y MYSQLi - ¿Vincula los parámetros usando loop y store in array?

 $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 se obtiene el valor de 'genreID' cuándo '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 contiene géneros de películas, por ejemplo:

[0] => Acción [1] => Aventura [2] => Fantasía

necesito para comparar de 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 ... cuando dbGenre es igual a Acción, entonces almacena el genreID en una matriz1, y luego haz un bucle en la matriz $ genre para obtener el genreID para el siguiente valor y almacenarlo de nuevo en array1

¿Cómo puedo solucionarlo? Soy nuevo en la programación así que sea lo más detallado posible. ¡¡Gracias!!

Respuesta

8

No puede enlazar 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 utilizar cualquiera de las dos soluciones:

Primera solución: un bucle sobre $genre matriz, se unen cada valor de a uno por vez, 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 compilar 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 es necesario conseguir difícil llamar bind_param() con un número variable de argumentos basados ​​en los elementos de la matriz $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 para unirse parámetros de una matriz. La interfaz MySQLi es bastante incómoda para este caso.

0

Algunas cosas.

  • ¿No es posible porque al sobreescribir el $ género var, intente cambiarlo a $ genreArray en el caso de sedond?
  • Asegúrese de que la base de datos es en realidad regresando cosas (probarlo en phpMyAdmin o algo similar)

  • procesamiento Trate de esta manera:

.

$genreId = -1; 
$stmt->bind_results($genreId); 
$stmt->execute(); 
while($stmt->fetch()){ 
    $genreArray[] = $genreId; 
} 
+0

Solo necesito cada genreID (que es un número) ... Digamos que ... cuando dbGenre es igual a Action, entonces almacena el genreID en la matriz y luego realiza un loop para obtener el genreID para el siguiente valor de matriz. – Jonathan

+0

ah Está bien, voy a editar mi respuesta. –

3

@ Bill Karwin

call_user_func_array no pasará los argumentos por referencia, pasará los valores lo tanto no funcionara! que le dará stmt-> error bind_param

PDO no es una solución mejor ... u todavía tiene que hacer una solución para eso también

esto debe ser editado en ur mensaje:

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... 
} 
+0

Creo 'y' también requerido antes de '$ value' en' foreach': 'foreach ($ género como $ clave => & $ valor) {' –