如何从查询中删除“LIMIT”之后的所有内容? (里面的细节)

时间:2012-08-09 11:52:13

标签: php

我的脚本动态构建了一些查询。它们通常适合以下模板:

SELECT ... 
FROM ... 
JOIN ... 
WHERE ... (lots of filters, search conditions, etc. here) ... 
ORDER BY (optional) ... 
LIMIT (optional) ... OFFSET (optional)

我想从查询中删除LIMIT和OFFSET部分。我用了

$sql_entitati = implode("LIMIT", explode("LIMIT", $sql_entitati, -1));

要做到这一点,但后来它击中了我:如果查询中没有LIMIT怎么办?如果唯一的LIMIT在where子句的某个地方怎么办?

所以我的问题是:如何在LIMIT关键字之后安全地删除所有内容,如果没有限制和/或没有限制和/或限制"限制" where子句中的某个地方?这一切都在php中完成。

为了清晰起见,进行了一些编辑:

我使用的算法:

$sql = implode("LIMIT", explode("LIMIT", $sql, -1));

将对99%的案件起作用。问题发生在" LIMIT"最后的关键词缺失,并且有#34; LIMIT"写在条件的某个地方。例如:

 SELECT * FROM table WHERE bla = 'SPEED LIMIT' ORDER BY table.a

这是我需要解决的问题。

使用以下算法解决(Credit to techfoobar):

    $p = strrpos($sql, "LIMIT");
    if($p !== false) {
        $q = strpos($sql, ")", $p);
        $r = strpos($sql, "'", $p);
        $s = strpos($sql, "\"", $p);
        if($q === false && $r === false && $s === false)
            $sql = substr($sql, 0, $p);
    }

4 个答案:

答案 0 :(得分:4)

您应该执行以下操作:

  1. 获取 last “LIMIT”的位置 - 将此位置存储在p
  2. 确保")"之后没有p个字符 - 如果是,则它是条件等内部查询的一部分。
  3. 确保"'"之后没有p字符 - 如果是,则它是某些用户输入字符串的一部分
  4. 如果通过了第2步和第3步,请在p
  5. 之后删除所有内容

    更多提示:

    • 对于第1步 - 使用strrpos作为LIMIT
    • 的最后一次出现
    • 对于步骤2和3,使用strpos并将p作为搜索起始偏移量
    • 对于第4步,使用substr删除p
    • 之后的所有内容

答案 1 :(得分:0)

获取LIMIT的位置,检查它是否存在!== FALSE然后是子串。

$str = "SELECT X FROM Y JOIN WHERE CONDITIONS ORDER BY ORDERS LIMIT OFFSET";

$pos = strrpos($str,"LIMIT");
if ($pos!==false)
{
$newStr = substr($str,0,$pos);
echo $newStr;
}

答案 2 :(得分:0)

尝试这种方法

$query = '';
$query .= 'SELECT...';
$query .= 'FROM ...';
$query .= 'JOIN ...';
$query .= 'WHERE...';
if ($limit)
{
    $query .= " LIMIT $limit";
}

答案 3 :(得分:0)

这可能对你有所帮助......

$str = " SELECT * FROM table WHERE bla = 'SPEED LIMIT' ORDER BY table.a";

$pos = strrpos($str,"LIMIT");
if ($pos!==false)
{
    $ok = 1;
    if(substr_count($str, '"', $pos) % 2 != 0)
    {
        $ok = 0;
    }
    if(substr_count($str, "'", $pos) % 2 != 0)
    {
        $ok = 0;
    }

    if(substr_count($str, ")", $pos) > 0)
    {
        $ok = 0;
    }



    if($ok == 1)
    $str = substr($str,0,$pos);
}

echo $str;