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

Dan*_*Dan 6 php mysqli mysqli-multi-query

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

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

循环中准备好的语句:

//prepare statement
foreach(whatever){
  //execute statement
}
Run Code Online (Sandbox Code Playgroud)

要么

多查询:

foreach(whatever){
  //build many queries into a single string
}
multi_query(long string)
Run Code Online (Sandbox Code Playgroud)

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

bob*_*yer 8

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

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

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

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


B T*_*B T 7

另外两个答案没有解决多查询和准备语句之间的实际差异 - 它们完全不同.

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

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

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