首页 > 解决方案 > 使用没有引用的 PHP MySQLi 准备语句?

问题描述

有没有办法在不传递引用的情况下使用 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()(因此没有要跟踪的长期变量),有没有办法让我使用准备好的语句而无需创建临时变量,以便我可以绑定它们?是否有我可以或应该使用的替代类/接口?

谢谢!

标签: phpmysqlmysqliprepared-statement

解决方案


就在这里。

前段时间,PHP 中添加了一个非常宝贵的特性——一个参数解包操作符。它有十亿个用途,在这种情况下帮助你就是其中之一。

只需...[在您的值列表之前和]之后添加 - 瞧,它有效!

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

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


推荐阅读