编程

PHP 8.1: MySQLi: 执行时绑定

874 2023-08-22 14:55:00

PHP 8.1 起,MySQLi 扩展的 mysqli_stmt_execute 函数及 mysqli_stmt::execute 方法(别名) 接收一个 $params 参数。如果传入参数,传入的值会被当作字符串绑定到语句中。 

此前,参数化的 SQL 查询需要调用 bind_param 显式绑定变量:

$statement = $db->prepare('SELECT * FROM posts WHERE pid = ?');
$statement->bind_param('s', $postId);
$statement->execute();

PHP 8.1 起,可以直接将参数传入到 execute 方法。这简化了参数绑定调用,否则必须使用 bind_param 调用来完成这些调用。这一变化也给 PDOStatement::execute 方法带来了特性差异,后者已经接受参数。

上面的代码在 PHP 8.1 中可以简化成:

$statement = $db->prepare('SELECT * FROM posts WHERE pid = ?');
$statement->execute([$postId]);

类似于上述面向对象的示例,过程式 MySQLi API 也在 mysqli_stmt_execute() 函数中接收这些参数:

  $statement = mysqli_prepare($connection, 'SELECT * FROM posts WHERE pid = ?');
- mysqli_stmt_bind_param($statement, 's', $postId);
- mysqli_stmt_execute();
+ mysqli_stmt_execute($statement, $postId);

更新后的 mysqli_stmt_execute 摘要

- function mysqli_stmt_execute(mysqli_stmt $statement): bool {
+ function mysqli_stmt_execute(mysqli_stmt $statement, ?array $params = null): bool  {
  }

更新后的 mysqli_stmt::execute 摘要

class mysqli_stmt {
  // ...
-   public function mysqli_stmt_execute(): bool {
+   public function mysqli_stmt_execute(?array $params = null): bool  {
    }
  }

向后兼容性影响

继承自mysqli_stmt 的扩展类也支持 $params 参数。

传入参数到 mysqli_stmt_execute() 函数/ mysqli_stmt::execute() 方法不会带来任何警告,不过需要注意的是参数不会被绑定,且可能导致错误。