为什么MySQLi准备好了声明?

时间:2011-03-04 23:04:23

标签: mysqli

在MySQLi中使用预准备语句有什么好处?

如果唯一的目的是保护查询,那么使用mysqli_real_escape_string之类的东西来清理查询不是更好,而不是为每个查询编写这么多行代码(比如prepare,bind_param,execute,close等)?

2 个答案:

答案 0 :(得分:12)

准备语句不仅仅是为了代码安全性。它有助于SQL Server解析您的语句并为您的查询生成执行计划。

如果运行SELECT 1000次,则SQL服务器必须解析,准备并生成有关如何获取数据1000次的计划。

如果您准备一个语句然后使用不同的绑定值运行预准备语句1,000次,那么该语句只被解析一次,并且每次都使用相同的查询计划。

这不仅有助于在脚本中运行1,000个查询,而且如果您只有1个语句并运行脚本1,000次。服务器可以记住计划服务器端。下次运行脚本时,它将再次使用相同的计划。

当然,对于一两个查询看起来似乎微不足道,但是当您开始重复执行大量查询或同一查询时,您将节省大量处理时间。

答案 1 :(得分:9)

有几个优点:

  • 安全性 - 您无需转义任何内容,只需绑定参数即可。
  • 正确性 - 如果您编写WHERE $x = 4,如果$x为空,则会出现语法错误,但WHERE ? = 4会有效。
  • 性能 - 准备好的查询可以重复使用不同的参数,保存重建字符串,还可以在服务器上重新分析。
  • 可维护性 - 代码更容易阅读。在连接字符串以创建SQL时,很容易最终得到大量的SQL和PHP代码混合在一起。使用预准备语句可以鼓励您将SQL与确定变量值分开。