sql >> Databáze >  >> RDS >> Mysql

Jak vložit pole do mysql pomocí PDO a bindParam?

Pokoušíte se vytvořit příkaz a svázat param.

Příkazy jsou skvělé, protože potenciálně ruší jakýkoli druh injekce SQL. A dělá to odstraněním konceptu dotazu, který je vnímán pouze jako řetězec. SQL dotaz je vnímán jako řetězec se seznamem parametrů a souvisejícími daty jako svázané proměnné. Dotaz tedy není pouze text, ale text + data.

Myslím:

Tento jednoduchý dotaz:

SELECT * FROM A WHERE val="$param"

Není to bezpečné, protože dotaz je zobrazen pouze jako řetězec. A pokud $param není zaškrtnuto, jedná se o SQLi díru.

Ale když vytvoříte příkaz, váš dotaz bude:

SELECT * FROM A WHERE val=:param

Potom použijete bindparam k zadání hodnoty a :param. Což znamená, že hodnota není připojena k řetězci dotazu, ale dotaz je již analyzován a data jsou poskytnuta.

Ve vašem případě navážete na param :array implodované pole (předpokládám "data1", "data2" atd..). Což je pouze jeden parametr s hodnotou jako řetězec ( "data1, data2, data3..."), takže výsledkem bude pouze jedno vložení, nikoli více vložení.

Generování příkazů můžete změnit vygenerováním dotazu s dostatečným počtem parametrů pro zpracování vašeho pole

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

Poté smyčku na vašem poli a volání metody bindparam pro každý parametr.

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

}

To bude fungovat.

Upravit :Toto řešení ukazuje, jak funguje pro jednorozměrné pole, ale lze jej snadno rozšířit na váš problém vyladěním generování dotazu na příkaz a úpravou smyčky bindparam.

Vaše prohlášení by mělo vypadat takto:

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

Stačí spočítat počet prvků ve vašem základním poli.




  1. Jak přidat sloupec automatického přírůstku do existující tabulky v MySQL

  2. Parametry Oracle s příkazem IN?

  3. Data se vyplní z data konkrétní tabulky namísto všech tabulek ve sqlite

  4. SYSUTCDATETIME() Příklady v SQL Server (T-SQL)