PHP / mysqli - 预处理语句(在循环中)或multi_query

时间:2011-02-22 02:34:13

标签: php mysqli mysqli-multi-query

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

我遇到过两种做同样事情的方式(多次更新查询),每种方式的优点/缺点是什么?我应该完全使用其中一种还是其他东西?

循环准备语句:

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

多查询:

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

我知道准备好的陈述提供了更好的安全性。 在PHP中使用mysql时我听说最好避免在循环中使用UPDATE语句 - 是不是在循环中用另一个名称执行mysqli预处理语句?

3 个答案:

答案 0 :(得分:8)

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

风格和资源方面,重用参数化语句是最好的,而不是不断地重新创建它。通过重用它,在初始bind_param调用之后你所做的就是在每次迭代时重新分配绑定的PHP变量的值,然后只需重新executing(参见: {{ 3}} 的)。

请记住,在您的WHERE子句中,您只需要另一个PHP变量赋值参数,例如WHERE (recordID = ?)来迭代。

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

答案 1 :(得分:7)

另外两个答案 not 解决了多查询和预处理语句之间的实际差异 - 它们完全不同。

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

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

所以我建议使用mutli-query来提高速度。如果使用mysqli :: real_escape_string正确转义数据,它的安全性就不那么安全了。多查询的另一个好处是,您可以在同一个请求中完成不同的查询 - 而准备好的语句依赖于查询对称性来提供任何好处。

答案 2 :(得分:0)

bob-the-destroyer是对的(更好地使用预备语句)。我只是想补充几点。

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

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