如果在循环中使用 MySQLi 准备好的语句,我啥时候调用 bind_param?
Posted
技术标签:
【中文标题】如果在循环中使用 MySQLi 准备好的语句,我啥时候调用 bind_param?【英文标题】:When do I call bind_param if using MySQLi prepared statements in a loop?如果在循环中使用 MySQLi 准备好的语句,我什么时候调用 bind_param? 【发布时间】:2012-11-30 11:21:24 【问题描述】:我正在尝试学习如何在 mysqli 中使用准备好的语句来插入数据。
尽管准备好的语句因其能够有效地重复执行类似语句而受到称赞,但我似乎无法找到使用 MySQLi 在循环中执行多个语句的示例。我特别对以下内容感到困惑:
是在循环前还是循环内调用bind_param
在调用bind_param
之前或之后是否给我的变量赋值
大多数关于准备好的语句的教程都使用 PDO。使用 PDO,可以将一组参数值传递给execute
,从而无需调用bindParam
。 MySQLi 并非如此。
php 手册mysqli_prepare
条目有一个示例,显示了以下操作顺序:
-
为变量赋值
准备声明
绑定变量
执行
关闭
根据上述判断,我假设我需要在循环中调用绑定语句。
但是,PHP 手册 mysqli_stmt_execute
条目有一个示例,显示了以下操作顺序:
-
准备声明
绑定变量
为变量赋值
执行
为变量赋值
执行
关闭
请注意,此示例未显示的一件事是变量的首次声明位置。我认为将未声明的变量传递给bind_param
会生成通知。我终于发现我可以传递未定义的变量,因为它们是通过引用传递的。
问题: 一种操作顺序是否优于另一种操作顺序?还是仅仅取决于你在做什么?两者之间有什么问题吗?
注意:代码已经使用 MySQLi,我不想切换到 PDO(现在切换超出了本项目的范围)。
【问题讨论】:
你在循环什么?您可以在循环中调用bind_param
,然后调用execute
。我没有完全理解我猜想的问题。
您绝对应该在之前 bind_param
设置变量。它会让调试变得非常更容易。
我的困惑源于陷入了“通过价值”的心态。我一直在想,我应该在更改值后重新绑定它们。
【参考方案1】:
由于参数是通过引用传递的,所以可以将值赋给或之后的变量致电bind_param
。无论哪种方式都可以。
如果变量是通过value 传递的,那么每次更改它们的值时都需要绑定它们。但是由于它们是通过引用传递的,所以只需要绑定一次。
在单次执行的情况下,操作顺序并不重要,可能取决于值的来源。 在循环的情况下,一定要在循环之前调用bind_param
。
【讨论】:
以上是关于如果在循环中使用 MySQLi 准备好的语句,我啥时候调用 bind_param?的主要内容,如果未能解决你的问题,请参考以下文章
php mysqli在嵌套循环中准备语句抛出命令或同步错误[重复]
mysqli 准备好的语句和 mysqli_real_escape_string