我的脚本动态构建了一些查询。它们通常适合以下模板:
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);
}
答案 0 :(得分:4)
您应该执行以下操作:
p
")"
之后没有p
个字符 - 如果是,则它是条件等内部查询的一部分。"'"
之后没有p
字符 - 如果是,则它是某些用户输入字符串的一部分p
更多提示:
strrpos
作为LIMIT
strpos
并将p
作为搜索起始偏移量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;