Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wstawić tablicę do mysql za pomocą PDO i bindParam?

Próbujesz utworzyć oświadczenie i powiązać param.

Instrukcje są świetne, ponieważ potencjalnie unieważniają każdy rodzaj iniekcji SQL. I robi to, usuwając koncepcję zapytania, które jest postrzegane tylko jako ciąg. Zapytanie SQL jest postrzegane jako ciąg znaków z listą parametrów i powiązanymi danymi jako powiązane zmienne. Zapytanie to nie tylko tekst, ale tekst + dane.

Mam na myśli:

To proste zapytanie:

SELECT * FROM A WHERE val="$param"

Nie jest to bezpieczne, ponieważ zapytanie jest wyświetlane tylko jako ciąg. A jeśli $param nie jest zaznaczone, jest to dziura SQLi.

Ale kiedy tworzysz oświadczenie, twoje zapytanie staje się:

SELECT * FROM A WHERE val=:param

Następnie używasz bindparam do określenia wartości :param. Co oznacza, że ​​wartość nie jest dołączona do ciągu zapytania, ale zapytanie jest już przeanalizowane i dane są dostarczone.

W twoim przypadku wiążesz z param :array implodowaną tablicę (zakładam "data1", "data2" itp.). Który jest tylko jednym parametrem z wartością w postaci ciągu ( "data1, data2, data3..." ), więc spowoduje to tylko jedną wstawkę, a nie wiele wstawień.

Możesz zmienić generowanie wyciągów, generując zapytanie z wystarczającą liczbą parametrów, aby obsłużyć twoją tablicę

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

Następnie wykonaj pętlę w swojej tablicy i wywołaj metodę bindparam dla każdego parametru.

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

}

To zadziała.

Edytuj :To rozwiązanie pokazuje, jak to działa w przypadku tablicy jednowymiarowej, ale można je łatwo rozszerzyć na swój problem, dostosowując generowanie zapytań i modyfikując pętlę bindparam.

Twoje oświadczenie powinno wyglądać tak:

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

Musisz tylko policzyć liczbę elementów w swojej tablicy bazowej.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Longtext odpowiednik MySQL w Microsoft SQL?

  2. Jak zachowuje się operator minus między dwiema datami i godzinami w MySQL?

  3. org.json.JSONException:Wartość <br typu java.lang.String nie może zostać przekonwertowana na JSONObject

  4. Jak mogę rejestrować tylko nieprzetworzone zapytania w MySQL?

  5. Migracja MySQL UTF8 do UTF8MB4 problemy i pytania