Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/233.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 强制限制用户MySQL查询_Php_Mysql_Pdo_Limit - Fatal编程技术网

Php 强制限制用户MySQL查询

Php 强制限制用户MySQL查询,php,mysql,pdo,limit,Php,Mysql,Pdo,Limit,因此,我有一个区域,人们可以对我的数据库编写自己的查询,但我希望限制返回的结果(很像PhpMyAdmin) 因此,我需要检查$\u POST['query']以查看是否有限制语句,如果有,请确保它在30以下,比如说。如果没有限制,我需要添加它 我该怎么做?忽略风险。。。我认为最好是将查询用作子查询并应用限制。因此避免对查询求值 SELECT * FROM ( SELECT * FROM 'table' LIMIT 0 , 100 ) AS query LIMIT 0 , 30 忽视

因此,我有一个区域,人们可以对我的数据库编写自己的查询,但我希望限制返回的结果(很像PhpMyAdmin)

因此,我需要检查
$\u POST['query']
以查看是否有限制语句,如果有,请确保它在30以下,比如说。如果没有限制,我需要添加它


我该怎么做?

忽略风险。。。我认为最好是将查询用作子查询并应用限制。因此避免对查询求值

SELECT * 
FROM (
 SELECT * 
 FROM 'table'
 LIMIT 0 , 100
) AS query

LIMIT 0 , 30

忽视风险。。。我认为最好是将查询用作子查询并应用限制。因此避免对查询求值

SELECT * 
FROM (
 SELECT * 
 FROM 'table'
 LIMIT 0 , 100
) AS query

LIMIT 0 , 30

您可以使用
preg.*
函数检查查询并输入您的首选限制

编辑:我完全忽略了
LIMIT
关键字的可能用法。这是经过编辑的版本

$query = 'SELECT * FROM aa LIMIT 100,20';
$limit = 20; // predefined max limit

// possibilities:
// LIMIT N[,N]
// LIMIT N OFFSET N

preg_match('~(?<=\blimit\s)\s*(?<limit>\d+)\s*(,\s*\d+|\soffset\s+\d+)?\s*$~i',$query,$limitStr);
if (isset($limitStr['limit'])) {
    $maxLimit = min((int)$limitStr['limit'],$limit);
    // user might have already limited it so this is
    // just to make sure it does not exceed your max.
    $query = preg_replace('~(?<=\blimit\s)\s*\d+\s*(,\s*\d+|\soffset\s+\d+)?\s*$~i',$maxLimit.'$1',$query);
} else $query .= " LIMIT $limit";

echo $query;
$query='SELECT*FROM aa LIMIT 100,20';
$limit=20;//预定义的最大限制
//可能性:
//极限N,N]
//限制N偏移量N

preg_match(“~(?您可以使用
preg_*
函数检查查询并注入首选限制

编辑:我完全忽略了
LIMIT
关键字的可能用法。这是编辑后的版本

$query = 'SELECT * FROM aa LIMIT 100,20';
$limit = 20; // predefined max limit

// possibilities:
// LIMIT N[,N]
// LIMIT N OFFSET N

preg_match('~(?<=\blimit\s)\s*(?<limit>\d+)\s*(,\s*\d+|\soffset\s+\d+)?\s*$~i',$query,$limitStr);
if (isset($limitStr['limit'])) {
    $maxLimit = min((int)$limitStr['limit'],$limit);
    // user might have already limited it so this is
    // just to make sure it does not exceed your max.
    $query = preg_replace('~(?<=\blimit\s)\s*\d+\s*(,\s*\d+|\soffset\s+\d+)?\s*$~i',$maxLimit.'$1',$query);
} else $query .= " LIMIT $limit";

echo $query;
$query='SELECT*FROM aa LIMIT 100,20';
$limit=20;//预定义的最大限制
//可能性:
//极限N,N]
//限制N偏移量N

preg_match(“~”)除非通过正则表达式模式进行检查(和修改),否则您会意识到这是非常危险的,对吗?除了解析查询并将限制放入其中之外,没有其他方法。但即使这样也不能保证,因为在某些情况下限制没有意义。例如,如果它们没有
select count(*)从表
中,除非通过正则表达式模式进行检查(和修改),否则您会意识到这是非常危险的,对吗?除了解析查询并将限制放入其中之外,没有其他方法。但即使这样也不能保证,因为在某些情况下限制是没有意义的。例如,如果它们执行了
选择count(*)从表中看
ooh,我在想正则表达式,但这是一个更优雅的解决方案。但是,是的,我认为每个读过这个问题的人都认为它疯狂。ooh,我在想正则表达式,但这是一个更优雅的解决方案。但是,是的,我认为每个读过这个问题的人都认为它疯狂。