【发布时间】:2012-12-20 02:45:43
【问题描述】:
可能重复:
Are prepared statements cached server-side across multiple page loads with PHP?
我正在开发一个新项目并首次使用参数化查询(PHP 与 MySQL DB)。我读到他们参数化的查询被缓存了,但我想知道它们被缓存了多长时间。例如,假设我有一个函数“getAllUsers()”,它从用户表中获取所有活动用户 ID 的列表,并且对于每个 ID,创建一个用户对象并且对函数“getUser($user)”的调用是用于设置对象的其他属性。 'getUser()' 函数有它自己准备好的查询,函数末尾有一个 stmt->close()。
如果我这样做,我在“getUser()”中的参数化查询是否完全利用了缓存,还是在每次 stmt->close() 之后从缓存中销毁查询?
注意:如果页面只需要单个用户对象的数据,我也会使用 getUser() 函数,所以我想这样做以确保如果用户表发生更改,我只需要更新一个查询。
这是做这种事情的正确方法还是有更好的方法?
更新:有趣,刚刚在 php.net 的准备语句手册上看到了这个 (http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)
使用准备好的语句并不总是执行语句的最有效方式。与未准备好的语句相比,只执行一次的准备好的语句会导致更多的客户端-服务器往返。
所以我想参数化查询的主要好处是防止 SQL 注入,而不一定要加快速度,除非它是一次重复的查询。
【问题讨论】:
-
好的,在阅读了其他内容后,我看到很多人说我不应该使用 stmt->free_result() 或 stmt->close() 除非它是一个消耗的长脚本很多内存,这是真的吗,我应该不使用它们吗?
-
@JasonMcCreary,这不是同一个问题。这是如果我想在一个页面上显示用户列表(或其他任何内容),该页面有一个查询 getAllUsers() 以选择所有 ID,然后在该函数中多次调用函数 getUser()。所以这一切都发生在一个页面加载中。
-
你能定义“缓存”吗?您还可以引用整个“缓存”的一些资料吗? real 数据库中的预处理语句(阅读:不是 MySQL)对预处理语句有一些高级魔法,但我从未见过任何 缓存 因为它们而进行。我预计您要么使用了错误的术语,因此感到困惑,要么一直在阅读声名狼藉的东西,因此感到困惑。
标签: php caching mysqli parameterized-query