Pokoušíte se vytvořit příkaz a svázat param.
Příkazy jsou skvělé, protože potenciálně ruší jakýkoli druh injekce SQL. A dělá to odstraněním konceptu dotazu, který je vnímán pouze jako řetězec. SQL dotaz je vnímán jako řetězec se seznamem parametrů a souvisejícími daty jako svázané proměnné. Dotaz tedy není pouze text, ale text + data.
Myslím:
Tento jednoduchý dotaz:
SELECT * FROM A WHERE val="$param"
Není to bezpečné, protože dotaz je zobrazen pouze jako řetězec. A pokud $param není zaškrtnuto, jedná se o SQLi díru.
Ale když vytvoříte příkaz, váš dotaz bude:
SELECT * FROM A WHERE val=:param
Potom použijete bindparam k zadání hodnoty a :param. Což znamená, že hodnota není připojena k řetězci dotazu, ale dotaz je již analyzován a data jsou poskytnuta.
Ve vašem případě navážete na param :array implodované pole (předpokládám "data1", "data2" atd..). Což je pouze jeden parametr s hodnotou jako řetězec ( "data1, data2, data3..."), takže výsledkem bude pouze jedno vložení, nikoli více vložení.
Generování příkazů můžete změnit vygenerováním dotazu s dostatečným počtem parametrů pro zpracování vašeho pole
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
Poté smyčku na vašem poli a volání metody bindparam pro každý parametr.
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
To bude fungovat.
Upravit :Toto řešení ukazuje, jak funguje pro jednorozměrné pole, ale lze jej snadno rozšířit na váš problém vyladěním generování dotazu na příkaz a úpravou smyčky bindparam.
Vaše prohlášení by mělo vypadat takto:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
Stačí spočítat počet prvků ve vašem základním poli.