Я пытаюсь узнать лучший способ писать запросы. Я также понимаю важность того, чтобы быть последовательным.
Пример:
$query = 'INSERT INTO table (id, col1, col2) VALUES (NULL, val1, val2)';
Кроме того, в приведенном выше примере рассмотрим, что "table," "col[n]," and "val[n]" могут быть переменными.
Каков стандарт для этого? Что вы делаете?
Я читал ответы на подобные вопросы около 20 минут, но, похоже, нет окончательного ответа на этот вопрос.
Здесь было много полезных ответов, в основном достигающих двух точек.
BACKTICKS() `используются вокруг имен идентификаторов. QUOTES(') используются вокруг значений.И как @MichaelBerkowski сказал
Backticks должны использоваться для идентификаторов таблиц и столбцов, но необходимы только тогда, когда идентификатор является зарезервированным ключевым словом MySQL или когда идентификатор содержит пробельные символы или символы за пределами ограниченного набора (см. ниже). Рекомендуется избегать использования зарезервированных ключевых слов в качестве идентификаторов столбцов или таблиц, когда это возможно, во избежание проблемы с кавычками.Существует случай, когда идентификатор не может быть зарезервированным ключевым словом или содержать пробелы или символы, находящиеся за пределами ограниченного набора, но обязательно требуют обратных ссылок вокруг них.
ПРИМЕР
123E10 является допустимым именем идентификатора, но также действительным INTEGER литералом.
[Не вдаваясь в подробности, как вы получите такое имя идентификатора], Предположим, что я хочу создать временную таблицу с именем 123456e6.
Нет ОШИБКИ на обратных шагах.
DB [XXX]> create temporary table `123456e6` (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
ОШИБКА, если вы не используете обратные сигналы.
DB [XXX]> create temporary table 123451e6 (`id` char (8));
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near '123451e6 (`id` char (8))' at line 1
Однако 123451a6 отлично имя идентификатора (без обратных тиков).
DB [XXX]> create temporary table 123451a6 (`id` char (8));
Query OK, 0 rows affected (0.03 sec)
Это полностью, потому что 1234156e6 также является экспоненциальным числом.
Помимо всех (хорошо объясненных) ответов, не было упомянутых ниже, и я часто посещаю этот Q & amp; A.
В двух словах; MySQL думает, что вы хотите сделать математику в своей таблице / столбце и интерпретируете дефисы, такие как «электронная почта», как e минус mail.
MySQL думает, что вы хотите сделать математику . Поэтому я думал, что добавлю это как ответ типа «FYI» для тех, кто совершенно не знаком с работа с базами данных и которые могут не понимать технические термины, описанные уже.
В основном в Mysql, эти типы идентификаторов используются в запросах `, ", ' и ().
" или ' используют для включения строка как значения "26-01-2014 00:00:00" или '26-01-2014 00:00:00'. Этот идентификатор используется только для функции неагрегации строки, например now() or sum ,max и т. Д. [F10] использовать для включения таблицы таблицы или таблицы, например. выберите column_name из table_name, где id = '2' () используются только для того, чтобы просто заключить части запроса, например. выберите column_name из table_name где (id = '2' и gender = 'male') или name = 'rakesh.Одиночные кавычки следует использовать для строковых значений, например, в списке VALUES ().
Backticks обычно используются для указания идентификатора и также могут быть безопасными из-за случайного использования зарезервированных ключевых слов.
В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время записи запросов.
Существует два типа кавычек в MySQL:
' для включения строковых литералов ` для включения идентификаторов, таких как имена таблиц и столбцовИ тогда есть ", что является частным случаем. Он может использоваться для одной из вышеупомянутых целей за раз в зависимости от сервера MySQL sql_mode:
' для включения строковых литералов В режиме ANSI_QUOTES кнопка " может использоваться для обозначения идентификаторов, как `SELECT "column" FROM table WHERE foo = "bar"
Запрос будет выбирать строковый литерал "column", где столбец foo равен строке "bar"
Запрос выберет столбец column, где столбец foo равен столбцу bar
В сочетании PHP и MySQL двойные кавычки и одинарные кавычки значительно упрощают время написания запросов.
$query = "INSERT INTO `table` (`id`, `col1`, `col2`) VALUES (NULL, '$val1', '$val2')";
Теперь предположим, что вы используете прямую переменную post в MySQL-запросе, тогда используйте ее следующим образом:
$query = "INSERT INTO `table` (`id`, `name`, `email`) VALUES (' ".$_POST['id']." ', ' ".$_POST['name']." ', ' ".$_POST['email']." ')";
Это лучшая практика для использования переменных PHP в MySQL.
Строковые литералы в MySQL и PHP одинаковы.
Строка представляет собой последовательность байтов или символов, заключенных в одну одинарную цитату («'») или двойную кавычку («») .Итак, если ваша строка содержит одинарные кавычки, вы можете использовать двойные кавычки для цитирования строки, или если она содержит двойные кавычки, тогда вы можете использовать одинарные кавычки для цитирования строки. Но если ваша строка содержит как одиночные кавычки, так и двойные кавычки, вам нужно избежать того, которое использовалось для цитирования строки.
В основном мы используем одинарные кавычки для значения строки SQL, поэтому нам нужно использовать двойные кавычки для строки PHP .
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, 'val1', 'val2')";
И вы можете использовать переменную в строке с двойными кавычками PHP:
$query = "INSERT INTO table (id, col1, col2) VALUES (NULL, '$val1', '$val2')";
Но если $val1 или $val2 содержит одинарные кавычки, это сделает ваш SQL будет ошибочным, поэтому вам нужно сбежать из него, прежде чем он будет использоваться в sql, это то, что mysql_real_escape_string для. (Хотя подготовленный оператор лучше.)