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.