2

作为类的bind_param($types, $var1, $var2, $var3,..)方法,mysqli_stmt它只获得一系列$variables第二个参数(我想在那里传递数组),并且$variables在我的情况下数量是未知的,我想在我的insert($data)函数中使用反射。http://php.net/manual/ru/mysqli-stmt.bind-param.php

我没有展示我的功能中不必要的部分,以避免混淆......

public function insert($data)
{
    $types = 'sss';
    $values = array_values($data);

删除了不相关的代码

    $ref    = new ReflectionClass($this->stmt);
    $method = $ref->getMethod("bind_param");

    //array_unshift($values,$types);                             1-option
    $values = array($types,'alex','alex@code.com','cats');       2-option

    $method->invokeArgs($this->stmt, $values);
    $done = $this->stmt->execute();

    $this->stmt->close();
    return $done;

}

如图所示

$method = $ref->getMethod("bind_param");

$method->invokeArgs($this->stmt, $values); 

在这一部分中,我使用反射将数组传递给对象bind_param()方法的第二个参数。$this->$stmt

$method->invokeArgs($this->stmt, $values); 

它不会使 mysqli 使用 1-option 插入表中。

但是当我使用 2-option 时,mysqli 会插入数据。为什么?我必须使用 1-option,因为参数的数量是未知的。

我怎样才能从 Reflection 和 mysqli 中受益呢?

这两个选项(数组)有什么区别?

4

1 回答 1

0

您可以使用 splat 运算符(PHP 版本 >= 5.6):

public function insert($data)
{
    $stmt = $this->link->prepare($sql);
    $stmt->bind_param(str_repeat('s', count($data), ...$data);
    $stmt->execute();
}
于 2016-02-24T14:05:40.627 回答