Php 确定SQL查询是否改变数据库结构
我试图找出字符串是否包含某些SQL命令,这些命令通过以下方式改变数据库:Php 确定SQL查询是否改变数据库结构,php,sql,string,strpos,Php,Sql,String,Strpos,我试图找出字符串是否包含某些SQL命令,这些命令通过以下方式改变数据库: 创建新表 删除现有表 创建新表列 删除现有表列 现在我正在做一个strpos搜索,搜索ALTER,CREATE和DROP,这应该可以用 是否有任何其他命令可以执行上述操作,并且我应该将其包含在搜索中 注意,出于安全原因,我不需要这个。我只需要知道表模式是否更改,这样我就可以更新模式信息的本地缓存…对于某些DBMS(PostgreSQL、MS SQL Server、Informix)选择。。。可以创建一个新表。通过字符串
- 创建新表
- 删除现有表
- 创建新表列
- 删除现有表列
ALTER
,CREATE
和DROP
,这应该可以用
是否有任何其他命令可以执行上述操作,并且我应该将其包含在搜索中
注意,出于安全原因,我不需要这个。我只需要知道表模式是否更改,这样我就可以更新模式信息的本地缓存…对于某些DBMS(PostgreSQL、MS SQL Server、Informix)
选择。。。可以创建一个新表。通过字符串检查很难做到这一点
还有其他方法可以进行更改,如:
SELECT *
INTO SomeTable
FROM SomeOtherTable
sp\u重命名“旧表”“新表”
安全或DDL触发器可能是更好的选择。如果字符串常量中发生ALTER、CREATE或DROP,则可能会出现一个误报
INSERT INTO News (headline) VALUES ('Stocks DROP for no reason!');
另外,strpos()
只查找文字子字符串,它不知道子字符串是否是较长单词的一部分
SELECT * FROM CLOTHING_ALTERATIONS
因此,您可能需要使用正则表达式,并确保单词位于语句的开头,并且是一个完整的单词
$num_matches = preg_match("/^\s*(ALTER|CREATE|DROP|RENAME)\b/m", $sql);
如果字符串包含SQL行注释,则使用多行regexp匹配非常重要
-- the following statement is run in my add_column() function
ALTER TABLE mytable ADD COLUMN ...
它可能更复杂,因为许多SQL实现允许/**/
作为内联的分隔符
一个更好的方法是不允许用户做这样的事情,只有管理员才能创建、修改或挖掘表格,任何用户都不应该有这个权利。为什么要重复上面的评论?我刚刚写到这不是出于安全原因:)我们怎么知道这不是一个管理接口?很多软件都有一个管理界面,允许人们更改表格。通常这些是用户定义的表,不允许使用核心应用程序表,但这是一种合法的设计。您的应用程序本身是否允许用户修改架构?他们是通过一些UI来实现的,还是用户真的可以输入他们想要运行的SQL?@david:你说得对:(我想我会每天让缓存过期一次或者什么的……在MYSQL中,还有RENAME
(数据库或表)。
/* added 12/7/2011 */ CREATE /* TEMPORARY */ TABLE mytable ...