sql >> Database >  >> RDS >> Mysql

Hoe array invoegen in mysql met behulp van PDO en bindParam?

Je probeert een statement te maken en een parameter te binden.

Verklaringen zijn geweldig omdat het mogelijk elke vorm van SQL-injectie teniet doet. En het doet dit door het concept te verwijderen dat een query alleen als een tekenreeks wordt gezien. De SQL-query wordt gezien als een string met een parameterlijst en de bijbehorende data als gebonden variabelen. De query is dus niet alleen tekst, maar tekst + data.

Ik bedoel:

Deze eenvoudige vraag:

SELECT * FROM A WHERE val="$param"

Het is niet veilig omdat de query alleen als een tekenreeks wordt bekeken. En als $param niet is aangevinkt, is het een SQLi-gat.

Maar wanneer u een verklaring maakt, wordt uw vraag:

SELECT * FROM A WHERE val=:param

Vervolgens gebruikt u bindparam om de waarde a :param op te geven. Dit betekent dat de waarde niet wordt toegevoegd aan de queryreeks, maar dat de query al is geparseerd en dat de gegevens zijn verstrekt.

In jouw geval bind je aan de param :array een geïmplodeerde array (ik neem aan "data1", "data2", enz..). Dat is slechts één parameter met de waarde als een tekenreeks ("data1, data2, data3..." ), dus het resulteert in slechts één invoeging en niet in meerdere invoegingen.

U kunt het genereren van uw instructie wijzigen door een query te genereren met voldoende parameters om uw array te verwerken

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

Loop vervolgens door je array en roep de bindparam-methode aan voor elke parameter.

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

}

Dit zal werken.

Bewerken :Deze oplossing laat zien hoe het werkt voor een eendimensionale array, maar kan eenvoudig worden uitgebreid tot uw probleem door het genereren van de instructiequery aan te passen en de bindparam-lus te wijzigen.

Uw verklaring zou er als volgt uit moeten zien:

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

Je hoeft alleen maar het aantal elementen in je basisarray te tellen.




  1. herschrijf verbinding en query van mysql naar PDO

  2. QR-codes genereren uit MySQL-rijen

  3. Elke opdracht in mysql die gelijk is aan Oracle's autotrace voor het draaien van prestaties

  4. php gebruikers-ID toewijzing werkt niet