如果在循环中使用 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?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用索引号将数据发送到mysqli(准备好的语句)

php mysqli在嵌套循环中准备语句抛出命令或同步错误[重复]

如何在 MySQLI 中使用准备好的语句?

mysqli 准备好的语句和 mysqli_real_escape_string

在准备好的语句中使用 LIKE '%$var%' 的正确方法? [mysqli]

在 mysqli 准备好的语句中使用空值