Znaki wsteczne mają być używane do identyfikatorów tabel i kolumn, ale są konieczne tylko wtedy, gdy identyfikator to Zarezerwowane słowo kluczowe MySQL , lub gdy identyfikator zawiera znaki odstępu lub znaki wykraczające poza ograniczony zestaw (patrz poniżej) Często zaleca się unikanie używania zarezerwowanych słów kluczowych jako identyfikatorów kolumn lub tabel, jeśli to możliwe, unikając problemu cytowania.
Pojedyncze cudzysłowy powinny być używane dla wartości łańcuchowych, takich jak w VALUES()
lista. Podwójne cudzysłowy są obsługiwane przez MySQL również dla wartości łańcuchowych, ale pojedyncze cudzysłowy są szerzej akceptowane przez inne RDBMS, więc dobrym zwyczajem jest używanie pojedynczych cudzysłowów zamiast podwójnych.
MySQL oczekuje również DATE
i DATETIME
wartości literałów, które mają być ujęte w pojedynczy cudzysłów jako ciągi, takie jak '2001-01-01 00:00:00'
. Zapoznaj się z literalami daty i godziny dokumentacja, aby uzyskać więcej szczegółów, w szczególności alternatywy dla użycia myślnika -
jako ogranicznik segmentu w ciągach dat.
Korzystając z twojego przykładu, umieściłbym ciąg PHP w podwójnym cudzysłowie i użyłbym pojedynczych cudzysłowów w wartościach 'val1', 'val2'
. NULL
jest słowem kluczowym MySQL i specjalną wartością (nie) i dlatego nie jest cytowana.
Żaden z tych identyfikatorów tabeli lub kolumny nie jest słowami zastrzeżonymi ani nie zawiera znaków wymagających cytowania, ale i tak zacytowałem je z zaznaczeniem (więcej o tym później...).
Funkcje natywne dla RDBMS (na przykład NOW()
w MySQL) nie powinny być cytowane, chociaż ich argumenty podlegają tym samym regułom cytowania, które zostały już wspomniane.
Backtick (`) table & column ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬───────┐ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ $query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`, `updated`) VALUES (NULL, 'val1', 'val2', '2001-01-01', NOW())"; ↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑ Unquoted keyword ─────┴┴┴┘ │ │ │ │ │ │ │││││ Single-quoted (') strings ───────────┴────┴──┴────┘ │ │ │││││ Single-quoted (') DATE ───────────────────────────┴──────────┘ │││││ Unquoted function ─────────────────────────────────────────┴┴┴┴┘
Interpolacja zmiennej
Wzorce cytowania zmiennych nie ulegają zmianie, chociaż jeśli zamierzasz interpolować zmienne bezpośrednio w łańcuchu, musi to być podwójne w cudzysłowie w PHP. Upewnij się tylko, że poprawnie zmieniłeś znaczenie zmiennych do użycia w SQL. (Zaleca się korzystanie z interfejsu API obsługującego przygotowane oświadczenia zamiast tego jako ochrona przed wstrzyknięciem SQL ).
// Same thing with some variable replacements // Here, a variable table name $table is backtick-quoted, and variables // in the VALUES list are single-quoted $query = "INSERT INTO `$table` (`id`, `col1`, `col2`, `date`) VALUES (NULL, '$val1', '$val2', '$date')";
Przygotowane zestawienia
Pracując z przygotowanymi stwierdzeniami, zapoznaj się z dokumentacją, aby ustalić, czy symbole zastępcze oświadczenia muszą być cytowane. Najpopularniejsze API dostępne w PHP, PDO i MySQLi, spodziewaj się niecytowane symbole zastępcze, podobnie jak większość przygotowanych interfejsów API instrukcji w innych językach:
// PDO example with named parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (:id, :col1, :col2, :date)";
// MySQLi example with ? parameters, unquoted
$query = "INSERT INTO `table` (`id`, `col1`, `col2`, `date`) VALUES (?, ?, ?, ?)";
Znaki wymagające cytowania wstecznego w identyfikatorach:
Zgodnie z dokumentacją MySQL , nie trzeba cytować (wstecz) identyfikatorów za pomocą następującego zestawu znaków:
ASCII:[0-9,a-z,A-Z$_]
(podstawowe litery łacińskie, cyfry 0-9, dolar, podkreślenie)
Możesz użyć znaków spoza tego zestawu jako identyfikatorów tabeli lub kolumny, w tym na przykład spacji, ale wtedy musisz cytuj je (wstecz).
Ponadto, chociaż liczby są prawidłowymi znakami identyfikatorów, identyfikatory nie mogą składać się wyłącznie z cyfr. Jeśli tak, muszą być owinięte w backticks.