Опитвате се да създадете изявление и да свържете параметър.
Изявленията са страхотни, защото потенциално анулират всякакъв вид SQL инжекция. И го прави, като премахва концепцията, че заявката се вижда само като низ. SQL заявката се разглежда като низ със списък с параметри и свързани данни като обвързани променливи. Така че заявката е не само текст, но и текст + данни.
Имам предвид:
Тази проста заявка:
SELECT * FROM A WHERE val="$param"
Не е безопасно, защото заявката се разглежда само като низ. И ако $param не е отметнат, това е дупка в SQLi.
Но когато създадете изявление, вашата заявка става:
SELECT * FROM A WHERE val=:param
След това използвате bindparam, за да посочите стойността a :param. Което означава, че стойността не е добавена към низа на заявката, но заявката вече е анализирана и данните са предоставени.
Във вашия случай се свързвате с param :array имплодиран масив (предполагам, че "data1", "data2" и т.н.). Което е само един параметър със стойността като низ ( "данни1, данни2, данни3..."), така че ще доведе само до едно вмъкване, а не до множество вмъквания.
Можете да промените генерирането на изявление, като генерирате заявка с достатъчно параметри, за да обработвате вашия масив
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
След това завъртете своя масив и извикайте метода bindparam за всеки параметр.
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
Това ще работи.
Редактиране :Това решение показва как работи за едномерен масив, но може лесно да бъде разширено до вашия проблем чрез настройване на генерирането на заявка за израз и модифициране на цикъла bindparam.
Вашето изявление трябва да изглежда така:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
Просто трябва да преброите броя на елемента във вашия основен масив.