Du försöker skapa ett uttalande och binda en param.
Uttalandet är bra eftersom det potentiellt upphäver alla typer av SQL-injektion. Och det gör det genom att ta bort konceptet med att en fråga bara ses som en sträng. SQL-frågan ses som en sträng med en parameterlista och tillhörande data som bundna variabler. Så frågan är inte bara text, utan text + data.
Jag menar:
Denna enkla fråga:
SELECT * FROM A WHERE val="$param"
Det är inte säkert eftersom frågan bara ses som en sträng. Och om $param inte är markerad är det ett SQLi-hål.
Men när du skapar ett uttalande blir din fråga:
SELECT * FROM A WHERE val=:param
Sedan använder du bindparam för att ange värdet a :param. Vilket betyder att värdet inte har lagts till i frågesträngen, men frågan är redan analyserad och data tillhandahålls.
I ditt fall binder du till param :array en imploderad array (jag antar "data1", "data2", etc..). Vilket bara är en parameter med värdet som en sträng ("data1, data2, data3..." ), så det kommer bara att resultera i en infogning och inte flera infogningar.
Du kan ändra din satsgenerering genom att generera en fråga med tillräckligt många parametrar för att hantera din array
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
Slinga sedan på din array och anropa bindparam-metoden för varje parametrar.
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
Detta kommer att fungera.
Redigera :Den här lösningen visar hur det fungerar för en endimensionell array, men kan enkelt utökas till ditt problem genom att justera satsfrågegenereringen och modifiera bindparam-loopen.
Ditt uttalande ska se ut så här:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
Du behöver bara räkna antalet element i din basmatris.