我有参数发送到数组中的预准备语句,我使用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->query($query, $fname, $mname, $lname, $dob, $mobile, $home, $email, $area, $city, $street, $bldg, $floor, $car_capacity, $status, $prefer_act, $volunteer_days, $backup_days);
答案 0 :(得分: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;