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预处理语句的另一个名称相同的东西?
如果由于某种原因你无法用一个mysql更新语句更新所有目标记录以避免完全需要这个PHP循环,那么update在循环中重用这个相同的mysqli语句对象就完全没问题了.
风格和资源方面,重用参数化语句是最好的,而不是不断地重新创建它.通过重用它,在初始bind_param调用之后所做的就是在每次迭代时重新分配绑定的PHP变量的值,然后简单地重新executing(参见:mysqli_stmt->execute示例#1面向对象的样式).
请记住,在你的WHERE子句中,你只需要另一个PHP变量赋值参数WHERE (recordID = ?)来迭代.
初始设置每个参数化语句需要额外的资源,因此应保留多个参数化语句以传递多个不相关的语句或查询.此外,似乎PHP的multi queries功能和方法根本不支持参数化.
另外两个答案没有解决多查询和准备语句之间的实际差异 - 它们完全不同.
准备好的语句 - 您创建一个语句模板,然后多次执行它,每个模板使用不同的值(使用bind_param).有一个服务器往返用于设置语句和每个查询一次往返.它使用MySQL的二进制协议来发送数据,因此它实际上将通过线路发送的数据少于普通查询.
多查询 - 这只是一次执行多个正常的MySQL查询.整个多查询有一个服务器往返.与准备好的语句相比,这几乎肯定提供了更好的性能(除非您的查询异常巨大并且变化的值很小).
所以我建议使用mutli-query来提高速度.如果使用mysqli :: real_escape_string正确转义数据,它的安全性就不那么安全了.多查询的另一个好处是,您可以在同一个请求中完成不同的查询 - 而预准备语句依赖于查询对称性来提供任何好处.