Php Regex查找string是否为mysql select语句

时间:2014-08-02 06:35:33

标签: php regex preg-match preg-match-all

我正在尝试在执行查询之前验证查询,如果查询不是mysql select语句,那么我必须向用户显示消息。

我在此链接中找到了以下正则表达式: Validate simple select query using Regular expression

$reg="/^Select\s+(?:\w+\s*(?:(?=from\b)|,\s*))+from\s+\w+\s+where\s+\w+\s*=\s*'[^']*'$/i"; 

接下来我写下面的代码,但它总是打印不是选择查询($ match每次都是空的)

$string="select * from users where id=1";
preg_match_all($reg,$string,$match);
if(!empty($match)){
echo "select query";
//execute and process result
//$this->user_model->list($string);
}else{
   echo "not select query";
   //show_message('inv_query');
}

请更正正则表达式以验证sql select语句(select,from,where,join,orderby groupby all in select statement)。  或者让我知道完成任务的其他好方法。

/*
some sample select statements
select * from users where id=1;

select * from users where id=1 AND name= 'Prabhu';

select * from users where id=1 AND name= 'Prabhu' order by name;

Select * from users where id=1 AND name= 'Prabhu' group by id order by name;

Select * from users join role on users.role_id=role.id where id=1 AND name= 'Prabhu' group by id order by name;
*/

1 个答案:

答案 0 :(得分:5)

为什么不能这样:

$reg = "/^(\s*?)select\s*?.*?\s*?from([\s]|[^;]|(['"].*;.*['"]))*?;\s*?$/i";

适用于SQL select查询示例:http://www.phpliveregex.com/p/6nP

它还会检查正在运行的唯一SQL查询是否为select查询,因此它应该只验证它们。它通过确保只有一个来做到这一点;除非那个;在一个字符串中,所以下面将验证。

select * from users where id=1 AND name= 'Pra;bhu';

但这不会。

select * from users where id=1 AND name= 'Prabhu'; drop table;

不检查的正则表达式;在一个字符串中,如果它在其中就会失败:

$reg = "/^(\s*?)select\s*?.*?\s*?from([\s]|[^;])*?;\s*?$/i"