Зворотні посилання слід використовувати для ідентифікаторів таблиць і стовпців, але вони необхідні лише тоді, коли ідентифікатор є зарезервованим ключовим словом MySQL або коли ідентифікатор містить символи пробілів або символи, що перевищують обмежений набір (див. Нижче) Часто рекомендується уникати використання зарезервованих ключових слів як можливі ідентифікатори стовпців або таблиць, коли це можливо, уникаючи проблеми котирування.
Одиничні лапки повинні використовуватися для рядкових значень, як у VALUES()
списку. Подвійні лапки підтримуються MySQL і для рядкових значень, але одинарні лапки більш широко прийняті іншими RDBMS, тому є доброю звичкою використовувати одинарні лапки замість подвійних.
MySQL також розраховує, що DATE
і DATETIME
буквальні значення будуть одноцитованими як рядки '2001-01-01 00:00:00'
. Для отримання більш детальної інформації зверніться до документації з літератури дати та часу , зокрема альтернативи використанню дефіса -
як роздільника сегмента у рядках дати.
Отже, використовуючи ваш приклад, я би подвійно цитував рядок PHP і використовував одиничні лапки на значення 'val1', 'val2'
. NULL
є ключовим словом MySQL і спеціальним (не) значенням, тому його не цитують.
Жоден із цих ідентифікаторів таблиці чи стовпців не є зарезервованими словами або не використовує символи, що вимагають цитування, але я все-таки цитував їх із задніми посиланнями (докладніше про це пізніше ...).
Функції, вроджені для RDBMS (наприклад, NOW()
в MySQL), не повинні цитуватися, хоча їхні аргументи підпорядковуються тим самим рядкам або ідентифікаційним правилам цитування, які вже були згадані.
Backtick (`)
таблиця та стовпець ─────────────────────────────────────────────────────── ───────┐
↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓ ↓
$ query = " ВСТАВИТИ в таблицю` (` id`, `col1`,` col2`, `дата`,` оновлено`)
ЦІННОСТІ (NULL, 'val1', 'val2', '2001-01-01', NOW ()) ";
↑↑↑↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑ ↑↑↑↑↑
Без котирування ключове слово ─────┴┴┴┘ │ │ │ │ │ │ │││││
Одно цитовані (') рядки ────────────────────────┘ │ │ │││││
Одноцитовані (') ДАТА ────────────────────────────────────────┘ ││││ │
Без котирування функція ──────────────────────────────────────────┴┴┴┴┘
Змінна інтерполяція
Шаблони цитування змінних не змінюються, хоча якщо ви маєте намір інтерполювати змінні безпосередньо в рядок, вони повинні бути подвійними цитатами в PHP. Просто переконайтеся, що ви правильно уникнули змінних для використання в SQL. ( Рекомендується натомість використовувати API, що підтримує підготовлені оператори, як захист від введення SQL ).
// Те саме з деякими змінними замінами
// Тут ім'я змінної таблиці $ table цитується за допомогою зворотного вибору та змінних
// у списку ЦІННОСТІ наведені одноцитування
$ query = "ВСТАВИТИСЬ В` $ table` (`id`,` col1`, `col2`,` date`) VALUES (NULL, '$ val1' , '$ val2' , '$ date' ) ";
Підготовлені заяви
Працюючи з підготовленими заявами, проконсультуйтеся з документацією, щоб визначити, чи потрібно цитувати заставники заяви. Найпопулярніші API, доступні в PHP, PDO та MySQLi, очікують не котируваних заповнювачів, як і більшість підготовлених API заяв іншими мовами:
// 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 (?, ?, ?, ?)";
Символи, що вимагають цитування зворотного посилання в ідентифікаторах:
Згідно з документацією на MySQL , вам не потрібно цитувати (backtick) ідентифікаторів, використовуючи такий набір символів:
ASCII: [0-9,a-z,A-Z$_]
(основні латинські літери, цифри 0-9, долар, підкреслення)
Ви можете використовувати символи поза цим набором як ідентифікатори таблиці або стовпців, включаючи, наприклад, пробіл, але тоді ви повинні цитувати їх (backtick).
"tablename"
, а одиничні цитати - для літералів, наприклад'this is a some text'
. Зворотні кліти ніколи не використовуються в стандартному SQL. (Якщо вам потрібно включити подвійну лапочку в ідентифікатор, введіть її двічі"odd""tablename"
. Аналогічно, подвійні одинарні лапки, як-от'Conan O''Brien'
.)