【问题标题】:call bind_param using call_user_func_array mysqli prepared statement [duplicate]使用 call_user_func_array mysqli 准备语句调用 bind_param [重复]
【发布时间】:2014-01-02 15:37:02
【问题描述】:

我有一个可以接受任意数量参数的函数,如下所示:

public function executePreparedStatement($query, $paramString = ''){
    $stmt = $this->db->prepare($query);
    if (func_num_args() > 2){
        $parameters = func_get_args();
        array_shift($parameters); // Get rid of the query
        $parameters = array('s', 'email@email.com');  //Hard code for test
        call_user_func_array(array($stmt, "bind_param"), $parameters);
        // $stmt->bind_param($parameters[0], $parameters[1]); //Hard code for test
    }
    $stmt->execute();
    $this->result = $stmt->get_result();
    $stmt->close();
}

问题是当我按原样运行代码时,stmt对象显示:

No data supplied for parameters in prepared statement

但是,当我注释掉 call_user_func_array 调用并取消注释后续行时,查询有效。

【问题讨论】:

  • $parameters 包含什么?
  • func_get_args() 在我的测试中返回 ['SELECT * FROM test WHERE email=?', 's', 'email@email.com'] 我保存到 $parameters。然后我使用 array_shift 摆脱查询,所以当我调用 bind_param $parameters = ['s', 'email@email.com'];
  • 简短回答:当您想制作像这样的通用准备语句执行函数时,使用 PDO 会更容易。

标签: php mysqli


【解决方案1】:

@Bill_Karwin 评论说这是重复的。我在那个答案中找到了解决方案。下面是我的函数(我必须让参数的值成为引用):

public function executePreparedStatement($query, $paramString = ''){
    $stmt = $this->db->prepare($query);
    if (func_num_args() > 2){
        $parameters = func_get_args();
        array_shift($parameters); // remove the query from the list
        // Array needs to be bound by reference
        foreach ($parameters as $key=>&$value) {
            $parameters[$key] = &$value;
        }
        call_user_func_array(array($stmt, "bind_param"), $parameters);
    }
    $stmt->execute();
    $this->result = $stmt->get_result();
    $stmt->close();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-09
    • 2012-11-30
    • 1970-01-01
    • 2012-12-13
    • 1970-01-01
    相关资源
    最近更新 更多