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将再次执行查询。(效率如此之高。或副作用。)

如果您对不超过一排感兴趣,请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 回答