我可以对 bind_param() 类型中的所有值使用字符串 ("sss...") 吗?如果没有,为什么不呢?

Can I use string ("sss...") for all the values in bind_param() type? If no, why not?

我正在我的 class 中创建一个方法,该方法的参数是 $sql, $types, $values .

function getResult($sql, $types, $values){
    $stmt = $this->conn->prepare($sql);
    $stmt->bind_param( "$types" , ...$values);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($result->num_rows > 0) {
        return $result;
    } else{
        return "There is no such row";
    }
}

但我想知道,也许我可以创建一个函数,其中 $types 是根据 $values 的计数自动生成的,并给它一个字符串 ("s")。像这样:

function getResult($sql, $values){
    $stmt = $this->conn->prepare($sql);
    $types = str_repeat("s", count($values));
    $stmt->bind_param( $types, ...$values);
    $stmt->execute();
    $result = $stmt->get_result();
    if ($result->num_rows > 0) {
        return $result;
    } else{
        return "There is no such row";
    }
}

这是不好的做法吗?它会使代码更小

是的,您绝对可以使用字符串来绑定每个参数。将参数绑定为字符串在 99.99% 的情况下都有效。在 MySQL 中只有少数情况参数的类型很重要。

您可以做的是创建一个将 $types 作为可选参数的函数。这将是最佳实践,因为如果您真的需要它们,它可以让您选择指定类型。

function getResult(string $sql, array $values, ?string $types = null): ?mysqli_result
{
    $stmt = $this->conn->prepare($sql);
    if (is_null($types)) {
        $types = str_repeat("s", count($values));
    }
    $stmt->bind_param($types, ...$values);
    $stmt->execute();
    return  $stmt->get_result() ?: null;
}

P.S。让函数 return 有两种类型的值是个坏主意。键入提示您的函数并坚持使用单一类型。