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で行われます。

わかりやすくするために少し編集します。

私が使用するアルゴリズム:

$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」の位置を取得します-この位置をたとえば、p
  2. ")"後に文字がないことを確認してくださいp- もしそうなら、それは条件内のいくつかの内部クエリの一部です..
  3. "'"後に文字がないことを確認してくださいp- もしそうなら、それはユーザー入力文字列の一部です
  4. ステップ 2 と 3 を通過した場合、その後のすべてを剥ぎ取ります。p

その他のヒント:

  • ステップ 1 の場合 -strrpos最後の出現に使用LIMIT
  • ステップ 2 と 3 では、strposwithpを検索開始オフセットとして使用します。
  • step4 のsubstr後にすべてを剥がすために使用します。p
于 2012-08-09T12:13:35.193 に答える
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 に答える
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 に答える