sql >> Database teknologi >  >> RDS >> Mysql

Hvordan indsætter man array i mysql ved hjælp af PDO og bindParam?

Du forsøger at oprette en erklæring og binde en param.

Statement er fantastisk, fordi det potentielt annullerer enhver form for SQL-injektion. Og det gør det ved at fjerne konceptet om, at en forespørgsel kun ses som en streng. SQL-forespørgslen ses som en streng med en parameterliste og de tilhørende data som bundede variabler. Så forespørgslen er ikke kun tekst, men tekst + data.

Jeg mener:

Denne enkle forespørgsel:

SELECT * FROM A WHERE val="$param"

Det er ikke sikkert, fordi forespørgslen kun ses som en streng. Og hvis $param ikke er markeret, er det et SQLi-hul.

Men når du opretter en erklæring, bliver din forespørgsel:

SELECT * FROM A WHERE val=:param

Så bruger du bindparam til at angive værdien a :param. Hvilket betyder, at værdien ikke er tilføjet til forespørgselsstrengen, men forespørgslen er allerede parset, og dataene er angivet.

I dit tilfælde binder du til param :array et imploderet array (jeg antager "data1", "data2" osv..). Som kun er én parameter med værdien som en streng ("data1, data2, data3..." ), så det vil kun resultere i én indsættelse og ikke flere indsættelser.

Du kan ændre din sætningsgenerering ved at generere en forespørgsel med nok parametre til at håndtere dit array

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

Løft derefter dit array og kald bindparam-metoden for hver parameter.

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

}

Dette vil virke.

Rediger :Denne løsning viser, hvordan den fungerer for en endimensionel matrix, men den kan nemt udvides til dit problem ved at justere sætningsforespørgselsgenereringen og modificere bindparam-løkken.

Dit udsagn skal se sådan ud:

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

Du skal bare tælle antallet af elementer i dit basisarray.




  1. Bord med koordinater for et sekskantet gitter, der dækker verden

  2. Unicode (hexadecimale) bogstaver i MySQL

  3. MySQL:Få n. højeste værdi for hver gruppe i en tabel

  4. Mysql - Hvordan søger man efter 26 poster, der hver begynder med bogstavet i alfabetet?