#Что означает ошибка
ERROR 1064 (42000): You have an error in your SQL syntax
Ошибка MySQL 1064 «You have an error in your SQL syntax» означает, что сервер не смог разобрать запрос. Текст ошибки заканчивается фразой «near '...' at line N» — именно в этом месте нужно искать проблему: она находится прямо перед процитированным фрагментом.
Типичные причины: зарезервированные слова в качестве имён, пропущенные запятые и кавычки, различия версий MySQL/MariaDB.
Разберём способы быстрого поиска.
Ошибка 1064 — синтаксическая ошибка в запросе. Текст сообщения указывает место рядом с ошибкой: проверьте кавычки, запятые, зарезервированные слова и версию MySQL.
#Причины и решения
| Возможная причина | Как узнать | Что делать |
|---|---|---|
| Зарезервированное слово как имя | order, group. | Заключите в обратные кавычки. |
| Пропущена запятая или скобка | Структура. | Исправьте. |
| Неверные кавычки | Типы. | Проверьте. |
| Синтаксис другой версии | MariaDB/MySQL. | Проверьте документацию. |
#Пошаговое решение
- Найдите место near в сообщенииСкопируйте полный текст
ERROR 1064и найдите фрагмент послеnear ... at line N. В phpMyAdmin откройте нужную базу → вкладка «SQL», вставьте проблемный запрос, но перед запуском запросов UPDATE/DELETE на рабочей базе создайте копию. Указатель near показывает место, где разбор запроса остановился, а ошибка может находиться раньше: проверьте также предыдущую строку, кавычку и запятую. - Проверьте зарезервированные словаПосмотрите, не используется ли имя столбца или таблицы, совпадающее с зарезервированным словом (
order,group,key). В SQL-редакторе MySQL обрамляйте такие идентификаторы обратными кавычками, напримерSELECTorderFROMorders``; одинарные кавычки предназначены для строковых значений, а не имён колонок. Если запрос собирает PHP-код, выясните, какую строку он реально отправляет серверу. - Проверьте запятые и скобкиНайдите в запросе непарные круглые скобки, лишнюю запятую перед
)и пропущенную запятую в списке полей. Проверяйте по частям: сначала безопасныйSELECTбез дополнительных условий, затем постепенно возвращайте JOIN/WHERE/ORDER BY. Для INSERT перечислите количество колонок и значений. Не выполняйте тестовый UPDATE или DELETE без WHERE на производственной базе. - Используйте подготовленные запросыЕсли значения поступают из формы PHP, не вставляйте их конкатенацией в текст SQL. В файле обработчика используйте PDO
prepare()с именованными параметрами, затемexecute(["email" => $email])с именем параметра:emailв запросе; идентификаторы таблиц и столбцов параметрами не подставляются. Выведите безопасный шаблон SQL и сообщение исключения в закрытый журнал без паролей и персональных данных. - Сверьте версию MySQLПодключитесь к серверу через MySQL CLI или вкладку SQL в phpMyAdmin, выполните только
SELECT VERSION();и сравните фактическую версию MySQL/MariaDB с синтаксисом запроса в официальной документации этой версии. Синтаксис CTE, оконных функций, JSON и некоторые зарезервированные слова различаются. Исправив запрос, повторите его сначала на тестовой базе и проверьте не только отсутствие 1064, но и правильный набор строк.
#Как читать сообщение
Фрагмент после near — первое, что сервер не понял, а ошибка обычно прямо перед ним. Например, near 'order FROM' указывает, что order — зарезервированное слово, его нужно заключить в обратные кавычки: ` order . Сверьте запятые в списке столбцов, парность скобок и кавычек, а также ;` внутри строки. Проверьте на или в клиенте.
#Частые случаи
Зарезервированные слова (order, group, key, desc, rank, read) в качестве имён. Строки в кавычках без экранирования (O'Brien): используйте подготовленные запросы. Лишняя запятая перед FROM или ). Использование синтаксиса другой СУБД (LIMIT в MS SQL, RETURNING в MySQL). Использование оконных функций и WITH на MySQL до 8.0 / MariaDB до 10.2.
#Подготовленные запросы и версии
В PHP применяйте PDO с плейсхолдерами: $st = $pdo->prepare("SELECT * FROM users WHERE id = ?"); $st->execute([$id]);. Это решает проблему кавычек и защищает от SQL-инъекций. Проверьте версию сервера: SELECT VERSION(); и сверьтесь с документацией . Для импорта дампа разных версий добавьте --force и посмотрите, на какой строке падает: mysql -u user -p db < dump.sql.
SELECT VERSION();SELECT `order`, `group` FROM `tbl` WHERE `key` = 'x';