【发布时间】:2018-03-26 09:05:28
【问题描述】:
我有一个Symfony 4 project,我想将mysql 查询作为字符串存储在mysql database 中。但是,在存储字符串之前,我想确保它们是有效的mysql syntax。有没有办法做到这一点?
谢谢!
【问题讨论】:
-
您是否希望将查询存储在要检查语句语法的同一数据库中?
-
目的是什么?
我有一个Symfony 4 project,我想将mysql 查询作为字符串存储在mysql database 中。但是,在存储字符串之前,我想确保它们是有效的mysql syntax。有没有办法做到这一点?
谢谢!
【问题讨论】:
我没有测试它,但它应该可以工作。
使用您在项目中已经使用的数据库 API 来 prepare the SQL statements 要验证然后丢弃它们;不要执行准备好的语句。
例如,使用 PDO,使用PDO::prepare() 要求服务器准备语句。它 returns 一个 PDOStatement 对象成功(即当查询正确时)。不要在返回的语句上调用execute(),直接丢弃它(使用unset())。
PDO::prepare() 返回FALSE 或在错误时引发异常,具体取决于 PDO 的 error handling 的配置方式。
【讨论】:
最简单的方法是在新事务中运行查询,然后将其回滚。 SQL 的验证可能会变得复杂,特别是如果您计划允许 MySQL 特定的功能。如果在下一个 MySQL 版本中引入了一个新功能怎么办?编写和维护单独的 SQL 验证库似乎适得其反。
为什么不尝试以下:
创建一个新用户以在您的数据库中运行这些查询。这将允许您管理安全性,例如只允许使用SELECT 语句,所以没有人会运行DROP DATABASE。
使用在第 1 点中创建的新用户运行用户提供的语句。使用START TRANSACTION 启动一个新事务,执行用户提供的语句,并使用ROLLBACK 回滚。确保按照13.3.1 START TRANSACTION, COMMIT, and ROLLBACK Syntax 设置SET autocommit=0。
如果用户提供的语句执行没有错误,则它是有效的。您不必阅读 PHP 代码中所有返回的行。
确保检查性能,因为某些语句的执行成本很高。这个功能可以 DOS 你的应用程序。
我可能会在数据库中create procedure or function。这就是他们的目的。将 SQL 存储在表中只是为了查询它然后执行只会导致数据库和应用程序之间的冗余往返。
【讨论】: