Mysql
 sql >> Database >  >> RDS >> Mysql

Come inserire array in mysql usando PDO e bindParam?

Stai cercando di creare un'istruzione e associare un parametro.

Le istruzioni sono ottime perché potenzialmente annullano qualsiasi tipo di iniezione SQL. E lo fa rimuovendo il concetto di una query vista solo come una stringa. La query SQL è vista come una stringa con un elenco di parametri e i dati associati come variabili associate. Quindi la query non è solo testo, ma testo + dati.

Voglio dire:

Questa semplice domanda:

SELECT * FROM A WHERE val="$param"

Non è sicuro perché la query viene visualizzata solo come una stringa. E se $param non è selezionato, è un buco SQLi.

Ma quando crei un'istruzione, la tua query diventa:

SELECT * FROM A WHERE val=:param

Quindi usi bindparam per specificare il valore a :param. Ciò significa che il valore non viene aggiunto alla stringa di query, ma la query è già stata analizzata e i dati vengono forniti.

Nel tuo caso, ti leghi al parametro :array un array imploso (presumo "data1", "data2", ecc.). Che è solo un parametro con il valore come stringa ("data1, data2, data3..." ), quindi risulterà in un solo inserimento e non in più inserimenti.

Puoi modificare la generazione della tua istruzione generando una query con parametri sufficienti per gestire il tuo array

$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";

Quindi esegui un ciclo sul tuo array e chiama il metodo bindparam per ogni parametro.

$count = 0;
foreach($values as $val)
{
   $stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
   $count++;

}

Funzionerà.

Modifica :questa soluzione mostra come funziona per un array unidimensionale, ma può essere facilmente estesa al tuo problema modificando la generazione della query dell'istruzione e modificando il ciclo bindparam.

La tua dichiarazione dovrebbe assomigliare a:

$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";

Devi solo contare il numero di elementi nel tuo array di base.