スクリプトによって動的に構築されたいくつかのクエリを取得しました。通常、次のテンプレートに適合します。
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で行われます。
わかりやすくするために少し編集します。
私が使用するアルゴリズム:
$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);
}