2012-10-19 26 views
1

我附加了一個函數到PHP中的REGEXP關鍵字,我發現SQLite3Result :: fetchArray重新執行查詢!什麼效率低下!PHP 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

多少次叫用'LIMIT 3'? –

+0

LIMIT不具影響力。它只是使查詢停止而不是整個表格。我用迴應的內容修改了我的帖子。 –

回答

2

看一看source code表明query只是爲了確定結果是否爲空而獲取第一行。第一次撥打fetchArray將再次執行查詢。 (效率太高,或副作用太大)

如果您對不超過一行感興趣,請使用querySingle代替。

要回答你的問題:這個按照設計工作。那個設計是一個錯誤。

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]; 
} 
+0

這完全不相干。問題不在於將正則表達式功能附加到SQL,而是執行兩次查詢。我發現通過使用自定義正則表達式函數.. –