2011-11-20 237 views
1

保存PDO準備的語句以便在會話中重用時是否有任何意義?緩存PDO準備語句

我構建使用MySQL全文查詢,這我在我的PHP組建了一個網站,如

SELECT * FROM table 
WHERE MATCH (title) AGAINST ($search_string IN BOOLEAN MODE) AND 
     MATCH (keywords) AGAINST ($keywords IN BOOLEAN MODE) 
ORDER BY $order_by $asc_desc 

這似乎需要更長的時間,當我準備運行這種查詢並使用綁定參數執行它,而不僅僅是準備並執行包含值的查詢字符串。但我需要使用預準備語句來防止SQL注入的風險。

在任何會話中,我很可能會多次使用不同的參數值運行相同的查詢。創建PDOStatement對象後(例如在會話中)保存PDOStatement對象是否合理?如果是這樣,那麼最好的方法是什麼?將每個準備好的語句保存在關聯數組中是否是一種很好的做法,因爲它是以SQL查詢字符串作爲每個關鍵字的關鍵字創建的?


在進一步閱讀中,我發現你不能使用綁定PARAMS的ORDER BY和語句的ASC/DESC一部分。當我用固定值替換它們時,性能會提高。

回答

3

將準備聲明存儲到會話中以實現可重用目的沒有任何好處,
查詢執行本身的代價很高。

0

如果您抓取的數據不斷變化,那麼在檢索結果集後不久,緩存結果集可能不再有效。

然而,如果你的數據似乎是靜態的:

session_start(); 
$_SESSION['cachedResultSet'] = $fetchedResultset; 
echo $_SESSION['cachedResultSet'][0][0]; 
# above statement `echo ...` depends on how your result is, be it an array or object 

我認爲這是可以接受的程度,以存儲在會話變量結果集,但也許這將取決於(對不起,是多餘的)是否數據變化很快,或者你多頻繁地抓住這個特定的結果集等等......

+0

Thanks Nonym - 我想知道緩存PDOStatement對象而不是記錄集。 –