Pro identifikátory tabulek a sloupců se mají použít zpětné zaškrtnutí, ale jsou nutné pouze v případě, že identifikátor je Vyhrazené klíčové slovo MySQL , nebo když identifikátor obsahuje prázdné znaky nebo znaky přesahující omezenou množinu (viz níže). Často se doporučuje nepoužívat vyhrazená klíčová slova jako identifikátory sloupců nebo tabulek, je-li to možné, aby se předešlo problému s citacemi.
U řetězcových hodnot jako v VALUES()
by se měly používat jednoduché uvozovky seznam. Dvojité uvozovky jsou podporovány MySQL i pro hodnoty řetězců, ale jiné RDBMS přijímají jednoduché uvozovky, takže je dobrým zvykem používat jednoduché uvozovky místo dvojitých.
MySQL také očekává DATE
a DATETIME
doslovné hodnoty, které mají být uváděny v jednoduchých uvozovkách jako řetězce jako '2001-01-01 00:00:00'
. Prostudujte si literály data a času dokumentaci pro více podrobností, zejména alternativy k použití pomlčky -
jako oddělovač segmentu v řetězcích data.
Takže pomocí vašeho příkladu bych řetězec PHP uvedl do dvojitých uvozovek a použil jednoduché uvozovky pro hodnoty 'val1', 'val2'
. NULL
je klíčové slovo MySQL a speciální (ne)hodnota, a proto není v uvozovkách.
Žádný z těchto identifikátorů tabulek nebo sloupců není vyhrazená slova ani nevyužívá znaky vyžadující uvozovky, ale i tak jsem je citoval se zpětným zaškrtnutím (více o tom později...).
Funkce nativní pro RDBMS (například NOW()
v MySQL) by neměly být citovány, ačkoli jejich argumenty podléhají stejným již zmíněným pravidlům pro citování řetězců nebo identifikátorů.
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 ─────────────────────────────────────────┴┴┴┴┘
Proměnná interpolace
Vzory uvozovek pro proměnné se nemění, i když pokud máte v úmyslu interpolovat proměnné přímo do řetězce, musí být v PHP uvozován dvakrát. Jen se ujistěte, že jste správně escapovali proměnné pro použití v SQL. (Doporučuje se používat API podporující připravená prohlášení místo toho jako ochranu proti SQL injection ).
// 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')";
Připravená prohlášení
Při práci s připravenými příkazy nahlédněte do dokumentace, abyste zjistili, zda musí být zástupné symboly příkazu citovány. Nejoblíbenější API dostupná v PHP, PDO a MySQLi očekávejte neuvozovaná zástupné symboly, stejně jako většina připravených příkazových rozhraní API v jiných jazycích:
// 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 (?, ?, ?, ?)";
Znaky vyžadující zpětné zaškrtnutí v identifikátorech:
Podle dokumentace MySQL , nemusíte uvádět (obrácené) identifikátory pomocí následující znakové sady:
ASCII:
[0-9,a-z,A-Z$_]
(základní latinská písmena, číslice 0-9, dolar, podtržítko)
Znaky nad rámec této sady můžete použít jako identifikátory tabulky nebo sloupce, včetně například mezer, ale pak musíte citovat (zaškrtnout).
I když jsou čísla platnými znaky pro identifikátory, identifikátory se nemohou skládat pouze z čísel. Pokud tak učiní, musí být zabaleny do zadních značek.