Znaki wsteczne należy stosować do identyfikatorów tabeli i kolumny, ale są one konieczne tylko wtedy, gdy identyfikator jest słowem kluczowym zastrzeżonym MySQL lub gdy identyfikator zawiera znaki spacji lub znaki spoza ograniczonego zestawu (patrz poniżej) Często zaleca się unikanie używania zastrzeżonych słów kluczowych w miarę możliwości jako identyfikatory kolumn lub tabel, unikając problemu cytowania.
W przypadku ciągów znaków, takich jak na VALUES()
liście, należy używać pojedynczych cudzysłowów . Podwójne cudzysłowy są obsługiwane przez MySQL również dla wartości ciągów, ale pojedyncze cudzysłowy są szerzej akceptowane przez inne RDBMS, więc dobrym zwyczajem jest stosowanie pojedynczych cudzysłowów zamiast podwójnych.
MySQL oczekuje także DATE
i DATETIME
wartości literalne być jedno-cytowany jako ciągi znaków, takich jak '2001-01-01 00:00:00'
. Zapoznaj się z dokumentacją literatury daty i godziny, aby uzyskać więcej szczegółów, w szczególności alternatywy dla używania łącznika -
jako ogranicznika segmentu w ciągach daty.
Korzystając z twojego przykładu, zacytowałbym podwójnie ciąg PHP i użyłem pojedynczych cudzysłowów na wartościach 'val1', 'val2'
. NULL
jest słowem kluczowym MySQL i specjalną (nie) wartością, dlatego nie jest cytowany.
Żaden z tych identyfikatorów tabeli lub kolumny nie jest słowem zastrzeżonym ani nie wykorzystuje znaków wymagających cytowania, ale i tak zacytowałem je za pomocą odwrotnych znaków (więcej o tym później ...).
Funkcje rodzime dla RDBMS (na przykład NOW()
w MySQL) nie powinny być cytowane, chociaż ich argumenty podlegają tym samym regułom cytowania ciągów znaków lub identyfikatorów, o których już wspomniano.
Backtick (`)
tabela i kolumna ───────┬─────┬──┬──┬──┬────┬──┬────┬──┬────┬──┬ ───────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " INSERT INTO` table` (`id`,` col1`, `col2`,` date`, `updated`)
WARTOŚCI (NULL, „val1”, „val2”, „2001-01-01”, NOW ()) ”;
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑ frazy
Niecytowane słowo kluczowe ─────┴┴┴┘ │ │ │ │ │ │ │││││
Ciągi pojedynczego cudzysłowu (') ───────────┴────┴──┴────┘ │ │ │││││
Pojedynczy cytat (') DATA ───────────────────────────┴──────────┘ ││││ │
Niecytowana funkcja ─────────────────────────────────────────┴┴┴┴┘
Zmienna interpolacja
Wzory cytowania dla zmiennych nie zmieniają się, chociaż jeśli zamierzasz interpolować zmienne bezpośrednio w ciągu, musi być on podwójnie cytowany w PHP. Po prostu upewnij się, że poprawnie zmieniłeś znaczenia zmiennych do użycia w SQL. ( Zalecane jest użycie zamiast tego interfejsu API obsługującego przygotowane instrukcje, jako zabezpieczenia przed wstrzyknięciem SQL ).
// To samo z niektórymi zamiennikami zmiennych
// Tutaj nazwa tabeli zmiennych $ table jest cytowana z powrotem i zmienne
// na liście WARTOŚCI są pojedynczymi cudzysłowami
$ query = "INSERT INTO` $ table` (`id`,` col1`, `col2`,` date`) VALUES (NULL, '$ val1' , '$ val2' , '$ date' ) ";
Przygotowane wyciągi
Podczas pracy z przygotowanymi wyciągami zapoznaj się z dokumentacją, aby ustalić, czy należy wstawić symbole zastępcze wyciągów. Najbardziej popularnym API dostępne w PHP, PDO i MySQLi spodziewać nienotowanych zastępcze, jak większość przygotowanych API oświadczenie 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ć identyfikatorów (backtick) przy użyciu 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 poza tym zestawem jako identyfikatorów tabeli lub kolumn, w tym na przykład białych znaków, ale musisz je zacytować (cofnąć).
"tablename"
Pojedyncze cudzysłowy są dla literałów, np'this is a some text'
. Znaczniki wsteczne nigdy nie są używane w standardowym języku SQL. (Jeśli chcesz podać podwójny cudzysłów w identyfikatorze, wpisz go dwa razy jako"odd""tablename"
. Podobnie, podwójne pojedyncze cudzysłowy w literałach, jak'Conan O''Brien'
.)