在没有引用的情况下使用 PHP MySQLi 准备好的语句?

问题描述 投票:0回答:3

有没有办法在不传递引用的情况下使用 MySQLi 准备好的语句?

[背景:我对 PHP 和 MySQL 非常陌生,但我继承了一个私有的 WordPress 插件来维护,所以我边学边学。]

我知道准备好的语句对于防止SQL注入很有用并且可能还可以加快查询速度(如果保留语句)但是对引用变量的需求似乎很奇怪。一个人预先调用

bind_param
然后在进行后续查询时只是将数据设置到那些绑定变量而不是与语句交互的想法吗?

现在我正在重构的代码有 17 个变量传递给

bind_param
。我创建了一个包含所有数据的类,因此我不再需要将 17 个变量从一个函数传递到另一个函数,但下面显然失败了,因为我的类没有返回引用:

$stmt->bind_param('ssssssisssssssssi',
      $my_class->get(FIELD_ONE),
      $my_class->get(FIELD_TWO),
      /*...x15 more...*/)

鉴于代码当前在

$stmt
之后立即丢弃
$stmt->execute()
(因此没有要跟踪的长期变量),我有什么办法可以使用准备好的语句而不必费心创建临时变量,这样我就可以束缚他们?是否有我可以或应该使用的替代类/接口?

谢谢!

php mysql mysqli prepared-statement
3个回答
5
投票

是的,有。

不久前,PHP 中添加了一个无价的功能 - 参数解包运算符。它有十亿种用途,在这种情况下帮助你就是其中之一。

只需在您的值列表之前添加

...[
并在之后添加
]
- 瞧,它有效!

$stmt->bind_param('ssssssisssssssssi', ...[
  $my_class->get(FIELD_ONE),
  $my_class->get(FIELD_TWO),
  /*...x15 more...*/
  ]);

提示:这个有用的运算符也可以用于将无聊的准备/绑定/执行过程封装在一个简单的函数中


3
投票

预先调用 bind_param 然后在进行后续查询时只是将数据设置到那些绑定变量而不是与语句交互的想法吗?

是的。带有绑定变量的准备好的语句的典型操作是:

prepare statement;
bind params;
for (some loop) {
    assign values to params;
    execute statement;
}

MySQLi
中,您只有
bind_param
的选项,因此仅限于传递引用。如果您不介意更改界面,可以切换到
PDO
,它具有
bindValue
功能,该功能将使用值而不是引用。
PDO
还可以让您通过简单地将值数组传递给语句
execute
调用来完全避免调用绑定参数/值。


0
投票

从 PHP 8.1 开始,有一种新方法可以将参数传递给 mysqli 的准备好的语句,不需要通过引用进行绑定。您可以在

mysqli_stmt::execute()
.

中将参数作为数组传递
$stmt->execute([
    $my_class->get(FIELD_ONE),
    $my_class->get(FIELD_TWO),
]);
© www.soinside.com 2019 - 2024. All rights reserved.