Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Wie füge ich ein Array mit PDO und bindParam in MySQL ein?

Sie versuchen, eine Anweisung zu erstellen und einen Parameter zu binden.

-Anweisung sind großartig, weil sie möglicherweise jede Art von SQL-Injection aufheben. Und es tut dies, indem es das Konzept entfernt, dass eine Abfrage nur als Zeichenfolge gesehen wird. Die SQL-Abfrage wird als String mit einer Parameterliste und den zugehörigen Daten als gebundene Variablen gesehen. Die Abfrage ist also nicht nur Text, sondern Text + Daten.

Ich meine:

Diese einfache Abfrage:

SELECT * FROM A WHERE val="$param"

Es ist nicht sicher, da die Abfrage nur als Zeichenfolge angezeigt wird. Und wenn $param nicht überprüft wird, ist es ein SQLi-Loch.

Aber wenn Sie eine Anweisung erstellen, wird Ihre Abfrage zu:

SELECT * FROM A WHERE val=:param

Dann verwenden Sie binparam, um den Wert a :param anzugeben. Das heißt, der Wert wird nicht an die Abfragezeichenfolge angehängt, aber die Abfrage ist bereits geparst und die Daten werden bereitgestellt.

In Ihrem Fall binden Sie an param :array ein implodiertes Array (ich nehme "data1", "data2" usw. an). Das ist nur ein Parameter mit dem Wert als String ("data1, data2, data3..." ), also führt es nur zu einer Einfügung und nicht zu mehreren Einfügungen.

Sie können Ihre Anweisungsgenerierung ändern, indem Sie eine Abfrage mit genügend Parametern generieren, um Ihr Array zu verarbeiten

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

Schleifen Sie dann Ihr Array und rufen Sie die bindparam-Methode für jeden Parameter auf.

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

}

Das wird funktionieren.

Bearbeiten :Diese Lösung zeigt, wie sie für ein eindimensionales Array funktioniert, kann aber leicht auf Ihr Problem erweitert werden, indem Sie die Anweisungsabfragegenerierung optimieren und die Bindparam-Schleife ändern.

Ihre Aussage sollte wie folgt aussehen:

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

Sie müssen nur die Anzahl der Elemente in Ihrem Basis-Array zählen.