Php - коли використовувати одиничні лапки, подвійні лапки і зворотні посилання в mysql, code q - a

Я намагаюся вивчити кращий спосіб писати запити. Я також розумію важливість того, щоб бути послідовним. До сих пір я випадково використав одиничні лапки, подвійні лапки і зворотні посилання без будь-якої реальної думки.

Крім того, в наведеному вище прикладі розглянемо, що "table," "col [n]," and "val [n]" можуть бути змінними.

Який стандарт для цього? Чим ти займаєшся?

Я читав відповіді на подібні питання тут близько 20 хвилин, але, схоже, немає остаточної відповіді на це питання.

Backticks повинні використовуватися для ідентифікаторів таблиць і стовпців, але необхідні тільки тоді, коли ідентифікатор є зарезервованим ключовим словом MySQL або коли ідентифікатор містить символи пробілу або символи за межами обмеженого набору (див. Нижче). Часто рекомендується уникати використання зарезервованих ключових слів Як ідентифікаторів стовпців або таблиць, якщо це можливо, щоб уникнути проблеми з лапками.

Одинарні лапки слід використовувати для строкових значень, наприклад, в списку VALUES (). Подвійні лапки підтримуються MySQL також для строкових значень, але одинарні лапки більш широко приймаються іншими РСУБД, тому непогано використовувати одинарні лапки замість подвійних.

Тому, використовуючи ваш приклад, я б двічі привів рядок PHP і використовував одинарні лапки для значень 'val1', 'val2'. NULL - це ключове слово MySQL і спеціальне (не) значення, тому воно не сортується.

Функції, родинні RDBMS (наприклад, NOW () в MySQL), не повинні цитироваться, хоча їхні аргументи підкоряються тим же правилам або правилам цитування, які вже згадувалися.

Мінлива інтерполяція

Шаблони цитування для змінних не змінюються, хоча, якщо ви маєте намір інтерполювати змінні безпосередньо в рядку, вона повинна бути двічі вказана в PHP. Просто переконайтеся, що ви правильно уникли змінних для використання в SQL. (Замість цього рекомендується використовувати API, що підтримує підготовлені інструкції, як захист від SQL-ін'єкції).

підготовлені заяви

Символи, які повертають зворотне посилання в ідентифікаторах:

Згідно з документацією MySQL. вам не потрібно вказувати ідентифікатори (backtick), використовуючи наступний набір символів:

ASCII: [0-9, az, AZ $ _] (базові латинські букви, цифри 0-9, долар, підкреслення)

Ви можете використовувати символи, що перевищують встановлені як ідентифікатори таблиць або стовпців, наприклад, прогалини, але тоді ви повинні вказати (зворотний хід) їх.

В MySQL існує два типи котирувань:

  1. 'Для включення строкових літералів
  2. `Для включення ідентифікаторів, таких як імена таблиць і стовпців

І тоді є "це особливий випадок. Він може використовуватися для однієї з вищезазначених цілей за раз в залежності від sql_mode сервера sql_mode.

  1. За замовчуванням "символ" може використовуватися для вкладення строкових літералів '
  2. У режимі ANSI_QUOTES "символ може використовуватися, щоб укладати ідентифікатори так само,`

Наступний запит призведе до різних результатів (або помилок) в залежності від режиму SQL:

ANSI_QUOTES відключений

Запит вибере строковий літерал "column" де стовпчик foo дорівнює рядку "bar"

включено ANSI_QUOTES

Запит буде вибирати стовпець column де стовпчик foo дорівнює стовпчику стовпчика

коли використовувати

  • Я пропоную вам уникати використання "щоб ваш код не залежав від режимів SQL
  • Завжди вказуйте ідентифікатори, оскільки це хороша практика (досить багато питань на SO обговорюють це)

(Є хороші відповіді вище, що стосуються характеру вашого питання SQL, але це також може бути актуальним, якщо ви новачок в PHP.)

Можливо, важливо відзначити, що PHP обробляє поодинокі і подвійні лапки по-різному.

Рядки з одним лапки - це «літерали» і являють собою рядки WYSIWYG. Рядки з подвійними лапками інтерпретуються PHP для можливої ​​підстановки змінних (зворотні посилання на PHP не є точно рядками, вони виконують команду в оболонці і повертають результат).

Backticks зазвичай використовуються для позначення identifier а також можуть бути безпечні від випадкового використання зарезервованих ключових слів.

Тут зворотні тики допоможуть сервера зрозуміти, що database містить ім'я бази даних, а не ідентифікатор бази даних.

Те ж саме можна зробити для імен таблиць і імен полів. Це дуже хороша звичка, якщо ви прив'язуєте свій ідентифікатор бази даних за допомогою зворотних посилань.

Перевірте цей відповідь, щоб дізнатися більше про зворотні висновках.

Але, щоб визначити значення, вам потрібно використовувати одиночні або подвійні лапки. Подивимося ще один приклад.

Тут я свідомо забув обернути title1 лапками. Тепер сервер візьме title1 як ім'я стовпця (тобто ідентифікатор). Отже, щоб вказати його значення, вам потрібно використовувати подвійні або одинарні лапки.

Тепер, використовуючи подвійні лапки в PHP, ви зробите змінні $ val1 і $ val2, щоб використовувати їх значення, створивши тим самим коректний запит. подібно

Рядкові літерали в MySQL і PHP однакові.

Рядок являє собою послідовність байтів або символів, укладених в символи одиночної лапки ( " ') або подвійні лапки (" "").

Тому, якщо ваша рядок містить одинарні лапки, ви можете використовувати подвійні лапки для цитування рядки, або якщо вона містить подвійні лапки, тоді ви можете використовувати одинарні лапки для цитування рядки. Але якщо ваша рядок містить як одинарні лапки, так і подвійні лапки, вам потрібно уникнути того, яке використовувалося для цитування рядки.

В основному, ми використовуємо одинарні лапки для значення рядка SQL, тому нам потрібно використовувати подвійні лапки для рядка PHP.

І ви можете використовувати змінну в рядку з подвійними лапками PHP:

Але якщо $ val1 або $ val2 містить одинарні лапки, це зробить ваш SQL помилковим. Тому вам потрібно втекти від нього, перш ніж він буде використовуватися в sql; Це те, що для mysql_real_escape_string. (Хоча підготовлену заяву краще.)

В основному в Mysql, ці типи ідентифікаторів використовуються в запитах `. '. 'І ().

`Використовувати для включення таблиці таблиці або таблиці, наприклад, select column_name з table_name де id = '2'

() Використовуються тільки для того, щоб просто укладати частини запиту, наприклад, select column_name з table_name де (id = '2' і gender = 'male') або name = 'rakesh'.

У поєднанні PHP і MySQL подвійні лапки і одинарні лапки значно спрощують час написання запитів.

Тепер припустимо, що ви використовуєте пряму змінну post в MySQL-запиті, тоді використовуйте її в такий спосіб:

Це найкраща практика використання змінних PHP в MySQL.

Якщо таблиці cols і значення є змінними, то існує два способи:

З подвійними лапками "" повний запит:

З однією цитатою ''.

Використовувати зворотні тики `` `, коли ім'я стовпця / значення схоже на ключове слово резервування MySQL.

Примітка. Якщо ви вказуєте ім'я стовпця з ім'ям таблиці, використовуйте зворотні тики наступним чином:

`Table_name`. `column_name` <- Примечание: исключить. Со спины

Одинарні лапки слід використовувати для строкових значень, наприклад, в списку VALUES ().

Backticks зазвичай використовуються для позначення ідентифікатора, а також можуть бути безпечними через випадкове використання зарезервованих ключових слів.

У поєднанні PHP і MySQL подвійні лапки і одинарні лапки значно спрощують час написання запиту.

Тут було багато корисних відповідей, в цілому досягають вищої точки в два пункти.

  1. BACKTICKS ( `) використовуються навколо імен ідентифікаторів.
  2. QUOTES ( ') використовуються навколо значень.

І як @MichaelBerkowski сказав

Backticks повинні використовуватися для ідентифікаторів таблиць і стовпців, але необхідні тільки тоді, коли ідентифікатор є зарезервованим ключовим словом MySQL або коли ідентифікатор містить символи пробілу або символи за межами обмеженого набору (див. Нижче). Часто рекомендується уникати використання зарезервованих ключових слів Як ідентифікаторів стовпців або таблиць, якщо це можливо, щоб уникнути проблеми з лапками.

Існує випадок, коли ідентифікатор не може бути зарезервованим ключовим словом або містити пробіли або символи, що знаходяться за межами обмеженого набору, але обов'язково вимагають зворотних посилань навколо них.

123E10 - це допустиме ім'я ідентифікатора, але також дійсний літерал INTEGER.

[Не вдаючись в подробиці, як ви отримаєте таке ім'я ідентифікатора], Припустимо, я хочу створити тимчасову таблицю з ім'ям 123456e6.

Ніякої ПОМИЛКИ на backticks.

ПОМИЛКА, якщо ви не використовуєте зворотні виклики.

Однак 123451a6 - це прекрасне ім'я ідентифікатора (без зворотних сигналів).

Це повністю тому, що 1234156e6 також є експоненціальним числом.