1

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

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 子句中的某处有“LIMIT”,我如何安全地删除 LIMIT 关键字之后的所有内容,而不会搞砸?所有这些都在 php.ini 中完成。

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

我使用的算法:

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

将适用于 99% 的案例。当末尾的“LIMIT”关键字丢失,并且条件中的某处写有“LIMIT”时,就会出现问题。例如:

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

这是我需要解决的问题。

使用以下算法解决(感谢 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

4 回答 4

4

您应该执行以下操作:

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

更多提示:

  • 对于第 1 步 -strrpos用于最后一次出现LIMIT
  • 对于第 2 步和第 3 步,使用strposwithp作为搜索起始偏移量
  • 对于第 4 步,使用substr剥离之后的所有内容p
于 2012-08-09T12:13:35.193 回答
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;
}
于 2012-08-09T12:00:20.830 回答
0

试试这个方法

$query = '';
$query .= 'SELECT...';
$query .= 'FROM ...';
$query .= 'JOIN ...';
$query .= 'WHERE...';
if ($limit)
{
    $query .= " LIMIT $limit";
}
于 2012-08-09T12:10:27.920 回答
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;
于 2012-08-09T12:20:38.210 回答