Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/79.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 确定SQL查询是否改变数据库结构_Php_Sql_String_Strpos - Fatal编程技术网

Php 确定SQL查询是否改变数据库结构

Php 确定SQL查询是否改变数据库结构,php,sql,string,strpos,Php,Sql,String,Strpos,我试图找出字符串是否包含某些SQL命令,这些命令通过以下方式改变数据库: 创建新表 删除现有表 创建新表列 删除现有表列 现在我正在做一个strpos搜索,搜索ALTER,CREATE和DROP,这应该可以用 是否有任何其他命令可以执行上述操作,并且我应该将其包含在搜索中 注意,出于安全原因,我不需要这个。我只需要知道表模式是否更改,这样我就可以更新模式信息的本地缓存…对于某些DBMS(PostgreSQL、MS SQL Server、Informix)选择。。。可以创建一个新表。通过字符串

我试图找出字符串是否包含某些SQL命令,这些命令通过以下方式改变数据库:

  • 创建新表
  • 删除现有表
  • 创建新表列
  • 删除现有表列
现在我正在做一个strpos搜索,搜索
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 ...