У меня есть Symfony 4 project, и я хочу хранить запросы mysql в виде строки в mysql database. Однако перед сохранением строк я хочу убедиться, что они действительны для mysql syntax. Есть способ сделать это?
Спасибо!
Возможный дубликат Проверка SQL-запроса с помощью PHP
Вы хотите хранить запросы в той же базе данных, по которой хотите проверить синтаксис оператора?
Какая цель?






Самый простой способ - запустить запрос в новой транзакции, а затем откатить его. SQL может быть сложным для проверки, особенно если вы планируете разрешить функции, специфичные для MySQL. Что, если в следующем выпуске MySQL появится новая функция? Написание и поддержка отдельной библиотеки проверки SQL кажется контрпродуктивным.
Почему бы не попробовать следующее:
Создайте нового пользователя для выполнения этих запросов в вашей базе данных. Это позволит вам управлять безопасностью, например. позволяет использовать только оператор SELECT, поэтому никто не будет запускать DROP DATABASE.
Запустите предоставленный пользователем оператор с использованием нового пользователя, созданного в пункте 1. Начните новую транзакцию с помощью START TRANSACTION, выполните предоставленный пользователем оператор и выполните откат с помощью ROLLBACK. Убедитесь, что SET autocommit=0 установлен в соответствии с 13.3.1 Синтаксис START TRANSACTION, COMMIT и ROLLBACK.
Если предоставленный пользователем оператор выполняется без ошибок, он действителен. Вам не нужно читать все возвращенные строки в вашем PHP-коде.
Обязательно проверьте производительность, потому что выполнение некоторых операторов будет дорогостоящим. Эта функция может DOS вашего приложения.
Я бы, наверное, создать процедуру или функцию в базе. Вот для чего они нужны. Сохранение SQL в таблице только для запроса и последующего выполнения приводит только к избыточному круговому обходу между базой данных и приложением.
Я не тестировал, но он должен работать.
Используйте API базы данных, который вы уже используете в своем проекте, для подготовить операторы SQL, который вы хотите проверить, а затем отбросьте их; не выполняйте подготовленные операторы.
Например, используя PDO, используйте PDO::prepare(), чтобы попросить сервер подготовить оператор. Это возвращается объект PDOStatement в случае успеха (т.е. когда запрос правильный). Не вызывайте выполнять() для возвращенного оператора, просто отбросьте его (используя unset()).
PDO::prepare() возвращает FALSE или выдает исключение при ошибке, в зависимости от того, как настроен PDO обработка ошибок.
Загляните в эту тему stackoverflow.com/questions/21557674/…