【问题标题】:Why MySQLi prepared statements?为什么 MySQLi 准备好语句?
【发布时间】:2011-07-09 04:27:02
【问题描述】:

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

如果唯一的目的是保护查询,那么使用mysqli_real_escape_string 之类的东西来清理查询不是更好,而不是为每个查询编写这么多行代码(如准备、绑定参数、执行、关闭等.)?

【问题讨论】:

  • 执行时间和查询缓存。
  • 问题是,“mysqli_real_escape_string”没有做任何可以称为“清理”之类的事情,更不用说使用这个函数了整个“查询”。至于多行调用,在获得一些编程经验后,您将学习如何编写自定义函数来简化重复性任务。

标签: php mysqli prepared-statement


【解决方案1】:

有几个优点:

  • 安全性 - 您无需转义任何内容,只需绑定参数即可。
  • 正确性 - 如果您编写 WHERE $x = 4,如果 $x 为空,则会出现语法错误,但 WHERE ? = 4 可以工作。
  • 性能 - 准备好的查询可以通过不同的参数重复使用,从而节省了重新构建字符串以及在服务器上重新解析的工作。
  • 可维护性 - 代码更易于阅读。在连接字符串以创建 SQL 时,很容易以混合大量 SQL 和 PHP 代码的小片段结束。使用准备好的语句鼓励您将 SQL 与确定变量的值分开。

【讨论】:

    【解决方案2】:

    准备语句不仅仅是为了代码安全。它帮助 SQL 服务器解析您的语句并为您的查询生成执行计划。

    如果您运行 SELECT 1000 次,那么 SQL 服务器将不得不解析、准备并生成一个计划,以了解如何获取 1000 次数据。

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

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

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

    【讨论】: