我在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)都回显模式和字符串非常相同。我非常怀疑查询是否被重新执行,这将是多余的。这是一个错误,还是只是我匆忙总结?
答案 0 :(得分:2)
查看source code会显示query
只是为了确定结果是否为空而取出第一行。第一次调用fetchArray
将再次执行查询。
(效率如此之高。或副作用。)
如果您对不超过一行感兴趣,请改用querySingle
。
回答你的问题:这是按设计工作的。而那个设计就是一个错误。
答案 1 :(得分: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];
}