Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como inserir array no mysql usando PDO e bindParam?


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.