sql >> Databasteknik >  >> RDS >> Mysql

Hur infogar man array i mysql med PDO och bindParam?

Du försöker skapa ett uttalande och binda en param.

Uttalandet är bra eftersom det potentiellt upphäver alla typer av SQL-injektion. Och det gör det genom att ta bort konceptet med att en fråga bara ses som en sträng. SQL-frågan ses som en sträng med en parameterlista och tillhörande data som bundna variabler. Så frågan är inte bara text, utan text + data.

Jag menar:

Denna enkla fråga:

SELECT * FROM A WHERE val="$param"

Det är inte säkert eftersom frågan bara ses som en sträng. Och om $param inte är markerad är det ett SQLi-hål.

Men när du skapar ett uttalande blir din fråga:

SELECT * FROM A WHERE val=:param

Sedan använder du bindparam för att ange värdet a :param. Vilket betyder att värdet inte har lagts till i frågesträngen, men frågan är redan analyserad och data tillhandahålls.

I ditt fall binder du till param :array en imploderad array (jag antar "data1", "data2", etc..). Vilket bara är en parameter med värdet som en sträng ("data1, data2, data3..." ), så det kommer bara att resultera i en infogning och inte flera infogningar.

Du kan ändra din satsgenerering genom att generera en fråga med tillräckligt många parametrar för att hantera din array

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

Slinga sedan på din array och anropa bindparam-metoden för varje parametrar.

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

}

Detta kommer att fungera.

Redigera :Den här lösningen visar hur det fungerar för en endimensionell array, men kan enkelt utökas till ditt problem genom att justera satsfrågegenereringen och modifiera bindparam-loopen.

Ditt uttalande ska se ut så här:

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

Du behöver bara räkna antalet element i din basmatris.




  1. Hur hämtar jag var N:te post från en tabell?

  2. Skapa och spara dynamiskt formulärfält i databasen php mysql

  3. MySQL inaktivera alla triggers

  4. Varför producerar en parameteriserad fråga mycket långsammare frågeplan jämfört med icke-parameteriserad fråga