3

可能重复:
准备好的语句是否使用 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 注入,而不一定要加快速度,除非它是一次重复的查询。

4

2 回答 2

3

调用mysqli_stmt::close将:

关闭准备好的语句。mysqli_stmt_close() 也释放语句句柄。

因此无法使用该语句的缓存版本进行进一步执行。我不介意释放资源或关闭语句,因为 PHP 无论如何都会在脚本结束时为您完成。

此外,如果您正在使用循环(如您所述),请查看mysqli_stmt::reset它将准备好的语句重置为其原始状态(在准备调用之后)。

于 2012-12-20T04:40:00.253 回答
0

从某种角度来看,这是个好问题。

首先,关于“缓存”。
准备好的查询有一些特别之处——您可以将其发送到服务器一次,然后多次执行。它可以为使用已经解析和准备好的查询提供一些小的理论上的好处。
看起来,您每次都准备查询时并没有使用这种机制。因此,根本没有缓存。

接下来,关于过早优化。
听说过一些缓存,它占据了你的想象力。
虽然您没有真正需要或理由担心缓存或任何性能问题。

因此,有一条规则:在性能问题成为现实之前,不要让自己陷入困境。
否则你会浪费你的时间。

于 2012-12-20T06:30:28.260 回答