1

PHPのREGEXPキーワードに関数をアタッチしましたが、SQLite3Result::fetchArrayがクエリを再実行することを発見しました。なんて非効率なんだ!

function _sqliteRegexp($pattern, $string)
{
    echo $pattern . ' - ' . $string . '<br/>';
    return preg_match('/' . $pattern . '/', $string);
}

$handle = new SQLite3($filename);
$handle->createFunction('regexp', '_sqliteRegexp', 2);

// (1)
$result = $handle->query("SELECT * FROM pages WHERE '" . $request_uri . "' REGEXP request LIMIT 1;");

// (2)
$result->fetchArray();

与える、例えば:

(1)
\/ - /admin/settings/1
\/sqlite - /admin/settings/1
\/admin - /admin/settings/1
\/admin\/logout - /admin/settings/1
\/admin\/settings(\/[0-9]+)? - /admin/settings/1

(2)
\/ - /admin/settings/1
\/sqlite - /admin/settings/1
\/admin - /admin/settings/1
\/admin\/logout - /admin/settings/1
\/admin\/settings(\/[0-9]+)? - /admin/settings/1

(1)と(2)はどちらもパターンをエコーし​​、まったく同じように弦を張ります。クエリが再実行されたのではないかと思いますが、これは非常に冗長です。これはバグですか、それとも私が急いで結論を出しているだけですか?

4

2 に答える 2

2

ソースコードqueryを調べると、結果が空かどうかを判断するためだけに最初の行がフェッチされていることがわかります。の最初の呼び出しfetchArrayでクエリが再度実行されます。(効率のためにこれだけです。または副作用。)

1行のみに関心がある場合は、querySingle代わりにを使用してください。

あなたの質問に答えるために:これは設計通りに機能します。そして、その設計はバグです。

于 2012-10-19T21:22:28.847 に答える
0

Havaliteのメソッド「sqlite_regExp」を確認してください:http ://www.havalite.com/?p = 98

LIMITでも動作します:

if($rows = sqlite_regExp("SELECT * FROM myTable WHERE preg_match('/sql(lite)*/ui', myRow) LIMIT 1")){
    foreach($rows as $row) echo $row[0];
}
于 2012-10-21T23:23:32.277 に答える