Domanda

Sarà più facile spiegare con il prossimo codice (A proposito, è sbagliato):

        $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;
            }
        }

Il codice sopra riportato ottiene il valore da 'genreID' quando 'dbGenre' è uguale a '$ genre'. E quindi archiviare i risultati in un array. Ma non funziona. Perché? Penso che "$ genre" sia un array, quindi ho bisogno di ripercorrerlo per ottenere un valore diverso da "genreID" ogni volta.

$ genre è un array enumerato contenente generi di film, ad esempio:

[0] = > Azione [1] = > Avventura [2] = > Fantasy

Devo confrontare il valore (ad esempio "Azione")

La tabella "generi" contiene due colonne: genreID (INT) e dbGenre (VARCHAR)

Ho solo bisogno di ogni genreID (che è un numero) .... Diciamo .. quando dbGenre è uguale ad Action, quindi memorizza il genreID in un array1, quindi esegui il ciclo dell'array $ genre per ottenere il genreID per il valore successivo e memorizzalo nuovamente in array1

Come posso ripararlo ?? Sono nuovo nella programmazione, quindi per favore sii il più dettagliato possibile. Grazie !!

È stato utile?

Soluzione

Non è possibile associare un array a un parametro SQL. Puoi utilizzare un parametro in SQL al posto di un valore letterale singolo . Non un elenco di valori o un'espressione o un nome di colonna o nome di tabella.

Per risolvere l'attività nel tuo caso, puoi utilizzare una delle due soluzioni:

Prima soluzione: passa in rassegna l'array $ genre , associa ogni valore uno alla volta ed esegue la query SQL per ciascun valore.

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;
    }
  }
}

Seconda soluzione: eseguire la query una volta, con più parametri, uno per ciascun valore nell'array. Ciò richiede un po 'di codice complicato per creare un numero variabile di segnaposto ? nella query SQL, separati da virgole.

$selectGenre_sql = 'SELECT genreID FROM genres WHERE dbGenre IN ('
 . join(',', array_fill(0, count($genre), '?')) . ')';

if ($stmt->prepare($selectGenre_sql)) {
  $genre = array();
  . . .

Inoltre, devi chiamare con difficoltà bind_param () con un numero variabile di argomenti in base agli elementi nel tuo array $ 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;
  }
}

Potresti prendere in considerazione l'uso di PDO :: mysql perché è più semplice associare i parametri a un array. L'interfaccia di MySQLi è piuttosto imbarazzante per questo caso.

Altri suggerimenti

@ Bill Karwin

call_user_func_array non passerà gli arg per riferimento, passerà i valori quindi non funzionerà! ti darà l'errore stmt- > bind_param

pdo non è una soluzione migliore ... devi ancora fare una soluzione anche per quello

questo dovrebbe essere modificato nel tuo post:

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

Alcune cose.

  • Potrebbe non essere perché sovrascrivendo $ genre var, provare a cambiarlo in $ genreArray nel caso sedond?
  • Assicurati che il database stia effettivamente restituendo cose (provalo in phpMyAdmin o qualcosa di simile)

  • Prova a elaborare in questo modo:

.

 $genreId = -1;
 $stmt->bind_results($genreId);
 $stmt->execute();
 while($stmt->fetch()){
  $genreArray[] = $genreId;
 }
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top