我得到了一些由我的脚本动态构建的查询。它们通常适合以下模板:
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);
}