可能重复:
Are prepared statements cached server-side across multiple page loads with PHP?
我正在开发一个新项目并首次使用参数化查询(带有MySQL数据库的PHP)。我读到他们参数化查询被缓存,但我想知道它们被缓存多长时间。例如,假设我有一个函数'getAllUsers()',它从用户表中获取所有活动用户ID的列表,并且对于每个ID,创建一个User对象并调用函数'getUser($ user)'是用于设置对象的其他属性。 'getUser()'函数有自己准备好的查询,在函数末尾有一个stmt-> close()。
如果我这样做,'getUser()'中的参数化查询是否完全利用了缓存,或者是在每个stmt-> close()后从缓存中销毁了查询?
注意:如果页面只需要单个用户对象的数据,我也使用getUser()函数,所以我想这样做以确保如果用户表发生更改,我只需要更新一个查询。 / p>
这是做这样的事情的正确方法还是有更好的方法?
更新:有趣的是,只是在php.net的手册中看到这个准备好的陈述(http://php.net/manual/en/mysqli.quickstart.prepared-statements.php)
使用预准备语句并不总是执行语句的最有效方式。仅执行一次的预准备语句会导致客户端 - 服务器往返次数超过未准备好的语句。
所以我猜参数化查询的主要好处是防止SQL注入,不一定要加快速度,除非它是一次重复的查询。
答案 0 :(得分:3)
致电mysqli_stmt::close
将:
因此,关闭准备好的声明。 mysqli_stmt_close()也解除了 陈述句柄。
无法使用语句的缓存版本进行进一步的执行。 我不介意释放资源或关闭语句,因为PHP无论如何都会在脚本结束时为你完成。
此外,如果您正在使用循环(如您所述),请查看mysqli_stmt::reset,它会将准备好的语句重置为其原始状态(在准备调用之后)。
答案 1 :(得分:0)
从某些角度来看,这是个好问题。
首先,关于"缓存" 准备好的查询有一些特殊之处 - 您可以将其发送到服务器一次,然后多次执行。它可以为使用已经解析和准备好的查询提供一些小的理论上的好处 看起来,每次准备每个查询时,你都没有使用这种机制。所以,根本就没有缓存。
接下来,关于过早优化 你已经听到的一些缓存,它占据了你的想象力 虽然没有真正的需要或原因让您关注缓存或任何性能问题。
因此,有一条规则:在真实存在之前,不要将性能问题占据自己 否则你会浪费你的时间。