Mysql
 sql >> Base de données >  >> RDS >> Mysql

Comment insérer un tableau dans mysql en utilisant PDO et bindParam ?

Vous essayez de créer une instruction et de lier un paramètre.

Les instructions sont excellentes car elles annulent potentiellement tout type d'injection SQL. Et il le fait en supprimant le concept d'une requête uniquement considérée comme une chaîne. La requête SQL est vue comme une chaîne avec une liste de paramètres et les données associées comme des variables liées. Ainsi, la requête n'est pas seulement du texte, mais du texte + des données.

Je veux dire :

Cette requête simple :

SELECT * FROM A WHERE val="$param"

Ce n'est pas sûr car la requête est uniquement considérée comme une chaîne. Et si $param n'est pas coché, c'est un trou SQLi.

Mais lorsque vous créez une déclaration, votre requête devient :

SELECT * FROM A WHERE val=:param

Ensuite, vous utilisez bindparam pour spécifier la valeur a :param. Ce qui signifie que la valeur n'est pas ajoutée à la chaîne de requête, mais que la requête est déjà analysée et que les données sont fournies.

Dans votre cas, vous liez au param :array un tableau implosé (je suppose "data1", "data2", etc..). Ce qui n'est qu'un paramètre avec la valeur sous forme de chaîne ( "data1, data2, data3..." ), il n'en résultera donc qu'une seule insertion et non plusieurs insertions.

Vous pouvez modifier la génération de votre instruction en générant une requête avec suffisamment de paramètres pour gérer votre tableau

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

Bouclez ensuite sur votre tableau et appelez la méthode bindparam pour chaque paramètre.

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

}

Cela fonctionnera.

Modifier  :Cette solution montre comment cela fonctionne pour un tableau unidimensionnel, mais peut être facilement étendue à votre problème en ajustant la génération de requête d'instruction et en modifiant la boucle bindparam.

Votre déclaration devrait ressembler à :

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

Il vous suffit de compter le nombre d'élément dans votre tableau de base.