PHP e MYSQLi - Associare i parametri usando loop e store in array?
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 !!
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;
}