Você está tentando criar uma instrução e vincular um parâmetro.
Statement são ótimos porque potencialmente anulam qualquer tipo de injeção de SQL. E faz isso removendo o conceito de uma consulta ser vista apenas como uma string. A consulta SQL é vista como uma string com uma lista de parâmetros e os dados associados como variáveis vinculadas. Portanto, a consulta não é apenas texto, mas texto + dados.
Quero dizer:
Esta simples consulta:
SELECT * FROM A WHERE val="$param"
Não é seguro porque a consulta é vista apenas como uma string. E se $param não estiver marcado, é um buraco SQLi.
Mas ao criar uma declaração, sua consulta se torna:
SELECT * FROM A WHERE val=:param
Então você usa bindparam para especificar o valor a :param. O que significa que o valor não é anexado à string de consulta, mas a consulta já está analisada e os dados são fornecidos.
No seu caso, você vincula ao param :array um array implodido (assumo "data1", "data2", etc.). Que é apenas um parâmetro com o valor como uma string ( "data1, data2, data3..." ), portanto, resultará apenas em uma inserção e não em várias inserções.
Você pode alterar sua geração de declarações gerando uma consulta com parâmetros suficientes para lidar com sua matriz
$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";
Em seguida, faça um loop em sua matriz e chame o método bindparam para cada parâmetro.
$count = 0;
foreach($values as $val)
{
$stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
$count++;
}
Isso funcionará.
Editar :Esta solução mostra como funciona para uma matriz unidimensional, mas pode ser facilmente estendida para o seu problema ajustando a geração da consulta de instrução e modificando o loop bindparam.
Sua declaração deve se parecer com:
$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";
Você só precisa contar o número de elementos em sua matriz base.