2011-11-20 188 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对象而不是记录集。 –