【问题标题】:Sending an array of parameters to bind_param将参数数组发送到 bind_param
【发布时间】:2017-08-26 22:02:57
【问题描述】:

我有要发送到数组中准备好的语句的参数,我正在使用call_user_func_array 并将其用作call_user_func_array(array($stmt, "bind_param"), array_merge(array($types), $params_fixed)),其中$types 包含类型,$params_fixed 包含参数。

我运行它并得到错误Warning: Parameter 2 to mysqli_stmt::bind_param() expected to be a reference, value given in ...,我搜索了这个错误,答案是通过引用发送参数,所以我在$params_fixed 参数之前添加了一个&,但是现在我得到了错误Fatal error: Call-time pass-by-reference has been removed in ...

我该如何解决这个问题?我在这里错过了什么?

注意:在学习之前我必须使用call_user_func_array,我一直在使用它$stmt->bind_param($types, ...$params_fixed)

注意 2:下面是填充要发送的数组的代码

    $params_fixed = array();
    $types = "";
    if($param_count > 0) {
      foreach($params as $param) {
        switch(gettype($param)) {
          case "boolean":
            $types = $types . "i";
            $params_fixed[] = $param ? 1 : 0;
            break;
          case "integer":
            $types = $types . "i";
            $params_fixed[] = &$param;
            break;
          case "double":
            $types = $types . "d";
            $params_fixed[] = &$param;
            break;
          case "string":
            $types = $types . "s";
            $params_fixed[] = &$param;
            break;
          default:
            $types = $types . "s";
            $params_fixed[] = null;
            break;
        }
      }
    }

注意 3:下面是有问题的代码

public function query($sql, ...$params) {
  $param_num_sql = substr_count($sql, "?");
  $param_count = count($params);

  if($param_num_sql != $param_count) {
    $this->error = 'parameters don\'t match';
    return null;
  }

  $params_fixed = array();
  $types = "";
  if($param_count > 0) {
    foreach($params as $param) {
      $types = $types . "s";
      $params_fixed[] = &$param;

      // switch(gettype($param)) {
      //   case "boolean":
      //     $types = $types . "i";
      //     $params_fixed[] = $param ? 1 : 0;
      //     break;
      //   case "integer":
      //     $types = $types . "i";
      //     $params_fixed[] = $param;
      //     break;
      //   case "double":
      //     $types = $types . "d";
      //     $params_fixed[] = $param;
      //     break;
      //   case "string":
      //     $types = $types . "s";
      //     $params_fixed[] = $param;
      //     break;
      //   default:
      //     $types = $types . "s";
      //     $params_fixed[] = null;
      //     break;
      // }
    }
  }

  if($param_num_sql == 0) {
    $result = $this->conn->query($sql);
  } else {
    $stmt = $this->conn->prepare($sql);

    //call_user_func_array(array($stmt, "bind_param"), array_merge(array($types), $params_fixed));

    //if(!$stmt->bind_param($types, ...$params_fixed)) {


echo "<br/>types: $types<br/>";
echo '<br/>';
print_r($params_fixed);
echo '<br/>';


    if(!call_user_func_array(array($stmt, "bind_param"), array_merge(array($types), $params_fixed))) {
      // an error occurred
    }

    $stmt->execute();

    $result = $stmt->get_result();

    $stmt->close();
  }

  if($result != null && $result->num_rows > 0)
    return $result->fetch_all();
  else
    return null;
}

下面是调用这个方法的代码

$dbcon-&gt;query($query, $fname, $mname, $lname, $dob, $mobile, $home, $email, $area, $city, $street, $bldg, $floor, $car_capacity, $status, $prefer_act, $volunteer_days, $backup_days);

【问题讨论】:

标签: php arrays mysqli prepared-statement pass-by-reference


【解决方案1】:

这样试试

        $mysqli = new mysqli('localhost', 'root','','mydb');

        $stmt=$mysqli->prepare("select * from blog where id=? and date=?");
            $title='1';
            $text='2016-04-07';
        call_user_func_array(array($stmt, "bind_param"),array_merge(array('ss'),array(&$title,&$text)));
        $stmt->execute();
        $result = $stmt->get_result();
        print_r($result->fetch_array());
        echo $stmt->error;

好的,如果你有来自数组的参数

        $mysqli = new mysqli('localhost', 'root','','jobspace');

        $stmt=$mysqli->prepare("select * from listings where listing_type_sid=? and user_sid=?");
            $title='6';
            $text='8';
            $arr=array($title,$text);
            foreach($arr as &$ar){
               $new[]=&$ar;
            }
        $types = implode(array_fill(0,count($arr),'s'));        
        call_user_func_array(array($stmt, "bind_param"),array_merge(array($types),$new));
        $stmt->execute();
        $result = $stmt->get_result();
        print_r($result->fetch_array());
        echo $stmt->error;

【讨论】:

  • 填充我的$params_fixed 数组时,我通过引用存储了变量,并在我的表中存储了一条记录,但是所有记录的值都相同“10”,日期为@987654324 @
  • 我在上面添加了填充参数变量的代码
  • 打印您的 $params_fixed 和 $types 并查看它是否具有您期望的正确值,然后再将其发送到 call_user_func_array()
  • 如果我打印它并通过引用保存变量,我会得到所有变量为“10”,如果我删除与号,我会得到实际值
  • 你可以像我发布的那样使用你不需要检查值的类型每个值都可以是's',所以只需静态准备你不需要 swith 和 case
猜你喜欢
  • 2013-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-22
  • 2017-03-02
  • 2018-01-22
相关资源
最近更新 更多