sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo insertar una matriz en mysql usando PDO y bindParam?

Está intentando crear una declaración y vincular un parámetro.

Las declaraciones son geniales porque potencialmente anulan cualquier tipo de inyección de SQL. Y lo hace eliminando el concepto de que una consulta solo se ve como una cadena. La consulta SQL se ve como una cadena con una lista de parámetros y los datos asociados como variables vinculadas. Por lo tanto, la consulta no es solo texto, sino texto + datos.

Quiero decir:

Esta simple consulta:

SELECT * FROM A WHERE val="$param"

No es seguro porque la consulta solo se ve como una cadena. Y si $param no está marcado, es un agujero de SQLi.

Pero cuando crea una declaración, su consulta se convierte en:

SELECT * FROM A WHERE val=:param

Luego usa bindparam para especificar el valor a :param. Lo que significa que el valor no se agrega a la cadena de consulta, pero la consulta ya se analizó y se proporcionaron los datos.

En su caso, vincula al parámetro:matriz una matriz implosionada (supongo que "datos1", "datos2", etc.). Que es solo un parámetro con el valor como una cadena ("datos1, datos2, datos3..."), por lo que solo dará como resultado una inserción y no múltiples inserciones.

Puede cambiar la generación de su declaración generando una consulta con suficientes parámetros para manejar su matriz

$sql = "INSERT INTO qresults (instance, qid, result) VALUES ( :val0, :val1, :val2, ...)";

Luego haga un bucle en su matriz y llame al método bindparam para cada parámetro.

$count = 0;
foreach($values as $val)
{
   $stmt->bindParam(":val$count", $val,PDO::PARAM_STR);
   $count++;

}

Esto funcionará.

Editar :Esta solución muestra cómo funciona para una matriz unidimensional, pero puede extenderse fácilmente a su problema ajustando la generación de consulta de declaración y modificando el bucle bindparam.

Su declaración debería verse así:

$sql = "INSERT INTO qresults (instance, qid, result) VALUES (:val0, :val1, :val2) , (:val3, :val4, :val5), ...";

Solo tiene que contar la cantidad de elementos en su matriz base.