Backticks ska användas för tabell- och kolumnidentifierare, men är endast nödvändiga när identifieraren är en MySQL reserverat sökord , eller när identifieraren innehåller blanksteg eller tecken utöver en begränsad uppsättning (se nedan) Det rekommenderas ofta att undvika att använda reserverade nyckelord som kolumn- eller tabellidentifierare när det är möjligt, för att undvika citatproblemet.
Enstaka citattecken ska användas för strängvärden som i VALUES()
lista. Dubbla citattecken stöds av MySQL för strängvärden också, men enkla citattecken accepteras mer allmänt av andra RDBMS, så det är en god vana att använda enkla citattecken istället för dubbla.
MySQL förväntar sig också DATE
och DATETIME
bokstavliga värden ska citeras som strängar som '2001-01-01 00:00:00'
. Se Datum och Time Literals dokumentation för mer information, särskilt alternativ till att använda bindestrecket -
som segmentavgränsare i datumsträngar.
Så med ditt exempel skulle jag dubbelcitera PHP-strängen och använda enkla citattecken på värdena 'val1', 'val2'
. NULL
är ett MySQL-sökord och ett speciellt (icke)-värde, och är därför utan citat.
Ingen av dessa tabell- eller kolumnidentifierare är reserverade ord eller använder tecken som kräver citat, men jag har citerat dem ändå med backticks (mer om detta senare...).
Funktioner som är inbyggda i RDBMS (till exempel NOW()
i MySQL) bör inte citeras, även om deras argument är föremål för samma sträng- eller identifierarcitatregler som redan nämnts.
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 ─────────────────────────────────────────┴┴┴┴┘
Variabel interpolation
Citatmönstren för variabler ändras inte, även om du avser att interpolera variablerna direkt i en sträng, måste det vara dubbelt citerat i PHP. Se bara till att du har escaped variablerna för användning i SQL. (Det rekommenderas att använda ett API som stöder förberedda uttalanden istället som skydd mot SQL-injektion ).
// 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')";
Förberedda uttalanden
När du arbetar med förberedda uttalanden, konsultera dokumentationen för att avgöra om uttalandets platshållare måste citeras eller inte. De mest populära API:erna som finns tillgängliga i PHP, PDO och MySQLi förväntas ociterade platshållare, liksom de flesta förberedda uttalandens API:er på andra språk:
// 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 (?, ?, ?, ?)";
Tecken som kräver backtick-citat i identifierare:
Enligt MySQL-dokumentationen , du behöver inte citera (backtick) identifierare med följande teckenuppsättning:
ASCII:
[0-9,a-z,A-Z$_]
(enkla latinska bokstäver, siffror 0-9, dollar, understreck)
Du kan använda tecken utöver den uppsättningen som tabell- eller kolumnidentifierare, inklusive blanksteg till exempel, men då måste citera (backtack) dem.
Även om siffror är giltiga tecken för identifierare, kan identifierare inte bestå enbart av siffror. Om de gör det måste de lindas in i backticks.