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

Obsługa danych z wielu pól wyboru

Przede wszystkim:

Postępowanie zgodnie z tą radą stało się ważniejsze niż kiedykolwiek, ext/MySQL jest teraz przestarzały i używanie go spowoduje emisję E_DEPRECATED błędy zaczynające się od PHP 5.5, pewnego dnia zostaną całkowicie usunięte z języka rdzenia. To powiedziawszy, poniższe dotyczy wszystkich sterowników dla wszystkich baz danych.

Do końca tego wyjaśnienia założę, że z jakiegoś powodu nie możesz używać MySQLi lub PDO (zauważ, że tylko zadowalającym powodem jest to, że nie są one dostępne, „nie wiem, jak ich używać” nie jest wymówką) i że jesteś zmuszony do korzystania z ext/MySQL. Jeśli jesteś w stanie użyć któregoś z nowszych sterowników, to możesz użyć przygotowanych instrukcji i nic z tego nie ma zastosowania. Mając to na uwadze...

Następnie przyjrzyjmy się, co jest nie tak z poprzednią odpowiedzią. Koncentruje się to na unikaniu wprowadzania danych przez użytkownika. Używa mysql_real_escape_string() to sposób, który naprawdę nie ma sensu. Powinno to być używane do ucieczki z literału pojedynczego ciągu i absolutnie niczego więcej. Nie można go używać do efektywnej zmiany znaczenia liczb i nie można go używać do oznaczania fragmentów kodu SQL, które są nie tylko wartościami.

Poniższe dwa fragmenty kodu pokazują prawidłowy sposób wykonania tego zadania, w zależności od tego, jakie są dane i, co najważniejsze, od ich typu.

Oto, co zrobilibyśmy, gdyby wartości były ciągami (zwykle CHAR lub VARCHAR pole):

// First create an array of individually escaped values with quotes added
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = "'".mysql_real_escape_string($ded)."'";
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

Ale często w tym scenariuszu wartości byłyby po prostu liczbami, a w tym przypadku wszystko, co musimy zrobić, to upewnić się, że PHP reprezentuje je poprawnym typem danych, ponieważ będą one automatycznie bezpieczne, gdy zostaną przekonwertowane z powrotem na ciągi użyte w zapytaniu:

// First convert the array values to integers
$deds = array();
foreach ($_POST['deductions'] as $ded) {
  $deds[] = (int) $ded;
}

// Now join them together in an SQL syntax
$deds_joined = join('), (', $deds);

// Now they can safely be used in the query
$query = "INSERT INTO mytable (deduction) VALUES ($deds_joined)";

Ten kod oczywiście zakłada, że ​​dane są typu integer, a wartości zmiennoprzecinkowe można łatwo obsłużyć, po prostu zmieniając (int) rzutuj na (float) .

Warto również zauważyć, że podejście łańcuchowe może być bezpiecznie iz powodzeniem stosowane również w przypadku wartości numerycznych, ponieważ MySQL przekonwertuje również wartości na właściwy typ. Ale ogólnie lepiej i wydajniej jest przekazać dane z poprawną reprezentacją typu w zapytaniu.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Dane binarne w MySQL

  2. Wybierz unikalny limit rekordów z N wierszami

  3. Aktualizacja danych MySQL na żywo

  4. MySQL — spraw, aby istniejące pole było unikalne

  5. Wybór danych tabeli z deklaracjami PDO