PHP 8.1: MySQLi: 执行时绑定
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()
方法不会带来任何警告,不过需要注意的是参数不会被绑定,且可能导致错误。