Avatar ·

Когда использовать одинарные, двойные кавычки и обратные кавычки в MySQL/PHP?

Всем привет! Я только начал изучать PHP и MySQL, и у меня постоянная путаница с кавычками. Вроде бы есть одинарные ('), двойные (") и обратные кавычки (`). Я не понимаю, когда какую использовать, и постоянно получаю ошибки. Например, вот мой код: ```php $name = "Иван"; $query = "SELECT * FROM users WHERE name = '$name'"; ``` Это работает. Но если я пишу так: ```php $query = 'SELECT * FROM users WHERE name = "$name"'; ``` То переменная не подставляется. А если я использую обратные кавычки: ```php $query = "SELECT * FROM `users` WHERE `name` = 'Иван'"; ``` Тоже работает, но я не понимаю, зачем они нужны. Еще я видел, что некоторые используют двойные кавычки для имен таблиц и столбцов: ```php $query = "SELECT * FROM \"users\" WHERE \"name\" = 'Иван'"; ``` Это вообще законно? И что делать, если в названии таблицы есть дефис или зарезервированное слово, например ORDER? У меня была ошибка с такой таблицей. Пожалуйста, объясните простыми словами, для новичка: когда в SQL-запросе, который я пишу в PHP, нужно использовать одинарные кавычки, когда двойные, а когда обратные. И как это связано с тем, что я пишу запрос внутри PHP-строки (которая тоже может быть в одинарных или двойных кавычках). Заранее спасибо! <<>>

Полное руководство по кавычкам в MySQL + PHP

Разберём три типа кавычек и их строгое назначение. Запомните главное правило: кавычки в SQL и кавычки в PHP — это разные вещи, хотя внешне они выглядят одинаково.

1. Одинарные кавычки (') — для строковых значений

В SQL одинарные кавычки используются только для строковых литералов (текста, дат, чисел в строковом формате).

-- Правильно: строка в SQL
SELECT * FROM users WHERE name = 'Иван';

-- Ошибка: двойные кавычки для строк в стандартном SQL
SELECT * FROM users WHERE name = "Иван";

В PHP: когда вы пишете SQL-запрос внутри PHP-строки, следите за вложенностью. Если PHP-строка в двойных кавычках — используйте одинарные для SQL-строк:

$name = "Иван";
// PHP-строка в двойных кавычках, SQL-строка в одинарных
$query = "SELECT * FROM users WHERE name = '$name'";

Если PHP-строка в одинарных — переменные не подставляются, и вам придётся конкатенировать:

$query = 'SELECT * FROM users WHERE name = "' . $name . '"'; // Работает, но некрасиво

2. Двойные кавычки (") — в MySQL для идентификаторов (режим ANSI_QUOTES)

По умолчанию в MySQL двойные кавычки работают как одинарные (для строк), но только если включён режим ANSI_QUOTES. Без этого режима использование двойных кавычек для строк может привести к ошибкам или непредсказуемому поведению. Лучше вообще не использовать двойные кавычки в SQL-запросах — это источник путаницы.

3. Обратные кавычки (`) — для имён таблиц и столбцов

Обратные кавычки в MySQL экранируют идентификаторы (имена таблиц, столбцов, баз данных). Они нужны в трёх случаях:

  • Зарезервированные слова: SELECT * FROM `order` (иначе ORDER будет воспринят как команда SQL)
  • Спецсимволы в имени: SELECT * FROM `user-data` (дефис воспринимается как минус)
  • Имена с пробелами: SELECT `first name` FROM users (плохая практика, но бывает)
// Без обратных кавычек — ошибка
$query = "SELECT * FROM order WHERE id = 1"; // Ошибка! ORDER — ключевое слово

// С обратными кавычками — работает
$query = "SELECT * FROM `order` WHERE id = 1";

// Для столбцов тоже
$query = "SELECT `name`, `email` FROM `users` WHERE `id` = 10";

4. Как экранировать кавычки в PHP-строке

Если внутри PHP-строки в двойных кавычках нужно использовать двойные кавычки для SQL — экранируйте их обратным слешем:

// Экранирование двойных кавычек внутри двойных
$query = "SELECT * FROM \"users\" WHERE \"name\" = 'Иван'"; // Работает, но не нужно

Но зачем? Просто используйте обратные кавычки для идентификаторов и одинарные для строк — и никакой путаницы.

5. Практические примеры (хороший и плохой код)

// ❌ ПЛОХО: смешение кавычек, риск SQL-инъекций
$name = $_GET['name'];
$query = "SELECT * FROM users WHERE name = '$name'"; // Уязвимо!

// ✅ ХОРОШО: подготовленные запросы (PDO)
$stmt = $pdo->prepare("SELECT * FROM users WHERE name = :name");
$stmt->execute(['name' => $name]);

// ✅ ХОРОШО: если без подготовки, то экранирование + правильные кавычки
$name = mysqli_real_escape_string($conn, $name);
$query = "SELECT * FROM `users` WHERE `name` = '$name'";

Итоговая таблица

  • ' (одинарные) — для строковых значений в SQL
  • " (двойные) — в SQL лучше не использовать, только если режим ANSI_QUOTES
  • ` (обратные) — для имён таблиц, столбцов, БД (особенно с зарезервированными словами)
  • В PHP — двойные кавычки подставляют переменные, одинарные — нет. Выбирайте внешние кавычки PHP так, чтобы внутренние кавычки SQL не конфликтовали.

Запомните: одинарные — для данных, обратные — для схемы, двойные — не используйте в SQL. И всегда используйте подготовленные запросы для безопасности!

<<>>

Альтернативный взгляд: меньше кавычек — меньше проблем

Хотя первый ответ технически верен, я предлагаю подход, который используют многие опытные разработчики: максимально избегать ручного написания SQL с кавычками.

Используйте ORM или Query Builder

Современные фреймворки (Laravel, Symfony) предоставляют Query Builder, который сам расставляет кавычки:

// Laravel Eloquent — никаких кавычек вручную
$users = DB::table('users')
            ->where('name', 'Иван')
            ->get();

// Или с зарезервированным именем таблицы
$orders = DB::table('orders')->where('id', 1)->get(); // 'orders' — не 'order'

PDO и именованные плейсхолдеры

Даже без фреймворка используйте PDO — он решает проблему кавычек автоматически:

$stmt = $pdo->prepare("SELECT * FROM users WHERE name = ?");
$stmt->execute(['Иван']); // PDO сам добавит кавычки и экранирует

Почему это лучше?

  • Безопасность: SQL-инъекции невозможны
  • Читаемость: нет путаницы с кавычками
  • Переносимость: если перейдёте на PostgreSQL, кавычки для идентификаторов там другие (двойные)

Запомните простое правило: если вы пишете '$variable' или "$variable" в SQL-запросе — вы делаете что-то не так. Переходите на подготовленные запросы, и вопрос кавычек отпадёт сам собой.