Du forsøger at oprette en erklæring og binde en param.
Statement er fantastisk, fordi det potentielt annullerer enhver form for SQL-injektion. Og det gør det ved at fjerne konceptet om, at en forespørgsel kun ses som en streng. SQL-forespørgslen ses som en streng med en parameterliste og de tilhørende data som bundede variabler. Så forespørgslen er ikke kun tekst, men tekst + data.
Jeg mener:
Denne enkle forespørgsel:
SELECT * FROM A WHERE val="$param"
Det er ikke sikkert, fordi forespørgslen kun ses som en streng. Og hvis $param ikke er markeret, er det et SQLi-hul.
Men når du opretter en erklæring, bliver din forespørgsel:
SELECT * FROM A WHERE val=:param
Så bruger du bindparam til at angive værdien a :param. Hvilket betyder, at værdien ikke er tilføjet til forespørgselsstrengen, men forespørgslen er allerede parset, og dataene er angivet.
I dit tilfælde binder du til param :array et imploderet array (jeg antager "data1", "data2" osv..). Som kun er én parameter med værdien som en streng ("data1, data2, data3..." ), så det vil kun resultere i én indsættelse og ikke flere indsættelser.
Du kan ændre din sætningsgenerering ved at generere en forespørgsel med nok parametre til at håndtere dit array
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
Løft derefter dit array og kald bindparam-metoden for hver parameter.
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
Dette vil virke.
Rediger :Denne løsning viser, hvordan den fungerer for en endimensionel matrix, men den kan nemt udvides til dit problem ved at justere sætningsforespørgselsgenereringen og modificere bindparam-løkken.
Dit udsagn skal se sådan ud:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
Du skal bare tælle antallet af elementer i dit basisarray.