6

我刚刚从使用 mysql 转移到 PHP 中的 mysqli 扩展。

我遇到了两种做同一件事的方法(多个更新查询),每种方法的优缺点是什么?我应该完全使用其中一个还是其他什么?

循环中的准备语句:

//prepare statement
foreach(whatever){
  //execute statement
}

或者

多查询:

foreach(whatever){
  //build many queries into a single string
}
multi_query(long string)

我知道准备好的语句提供了更好的安全性。在 PHP 中使用 mysql 时,我听说最好避免在循环中使用 UPDATE 语句 - 在循环中执行 mysqli 准备好的语句不是用另一个名称来做同样的事情吗?

4

3 回答 3

8

如果由于某种原因您不能只使用一个 mysql 更新语句来更新所有目标记录以避免完全需要这个 PHP 循环,那么update在循环中重用这个相同的 mysqli 语句对象是完全可以的。

在样式和资源方面,最好重用您的参数化语句,而不是不断地重新创建它。通过重用它,您在初始bind_param调用之后所做的就是在每次迭代时重新分配绑定的 PHP 变量的值,然后简单地重新executing(参见:mysqli_stmt->execute示例#1 面向对象的样式)。

请记住,在您的WHERE子句中,您只会有另一个 PHP 变量分配参数WHERE (recordID = ?)来进行迭代。

初始设置每个参数化语句需要额外的资源,因此应保留多个参数化语句以传入多个不相关的语句或查询。此外,PHP 的函数和方法似乎根本不multi queries支持参数化。

于 2011-02-22T03:00:47.407 回答
7

其他两个答案没有解决多查询和准备语句之间的实际差异——它们是完全不同的。

  • 准备好的语句 - 您创建一个语句模板一次,然后使用每个模板使用的不同值(使用 bind_param)多次执行它。有一个服务器往返用于设置语句每个查询有一个往返。它使用 MySQL 的二进制协议来发送数据,因此它实际上通过线路发送的数据比普通查询要少。

  • 多查询 - 这只是一次执行多个普通的 MySQL 查询。整个多查询有一个服务器往返。与准备好的语句相比,这几乎肯定会提供更好的性能(除非您的查询异常巨大并且变化的值很小)。

So I would recommend mutli-query for speed. Its no less secure if you properly escape your data with mysqli::real_escape_string. Another benefit of multi-query is that you can do completely different queries all in the same request - while prepared statements rely on query symmetry to provide any benefit.

于 2012-02-14T01:39:11.167 回答
0

bob-the-destroyer 是对的(最好使用准备好的语句)。我只是想添加一些东西。

  1. 在循环后执行$mysqli->multi_query($sql)相当于$mysqli->query($sql)每次在循环内执行。multi_query和 just之间的区别在于queryquery接受超过 1 个以分号分隔的查询。multi_query 确实使检查执行的第二个和后续查询的错误变得更加困难。

  2. 我不知道为什么有人会避免在循环内发出更新。但最好的做法是将循环包装在事务中,因此如果任何查询失败,您可以回滚所有更新。

于 2011-02-22T11:00:27.777 回答