mpe*_*pen 1 php mysqli reference pass-by-reference
基本上,我试图调用的mysqli :: bind_param通过call_user_func_array.
这是我的功能:
function Insert($table, $values=array(), $flags=0) {
$field_count = count($values);
if($field_count > 0) {
$fields = implode(',',array_keys($values));
$placeholders = implode(',',array_repeat('?',$field_count));
} else {
$fields = '';
$placeholders = '';
}
if($flags > 0) {
$flag_arr = array();
if($flags & self::LOW_PRIORITY) $flag_arr[] = 'LOW_PRIORITY';
if($flags & self::DELAYED) $flag_arr[] = 'DELAYED';
if($flags & self::HIGH_PRIORITY) $flag_arr[] = 'HIGH_PRIORITY';
if($flags & self::IGNORE) $flag_arr[] = 'IGNORE';
$flags_str = implode(' ',$flag_arr);
} else {
$flags_str = '';
}
$sql = "INSERT $flags_str INTO $table ($fields) VALUES ($placeholders)";
$stmt = $this->mysqli->prepare($sql);
if($stmt === false) {
throw new Exception('Error preparing MySQL statement.<br/>MSG: '.$this->mysqli->error.'<br/>SQL: '.$sql);
}
if($field_count > 0) {
$types = '';
foreach($values as $val) {
if(is_int($val)) $types .= 'i';
elseif(is_float($val)) $types .= 'd';
elseif(is_string($val)) $types .= 's';
else $types .= 'b';
}
$params = array_merge(array($types),array_values($values));
call_user_func_array(array($stmt,'bind_param'),$params);
}
$stmt->execute();
return $stmt;
}
Run Code Online (Sandbox Code Playgroud)
问题出现call_user_func_array在线上.我收到此错误:
mysqli_stmt :: bind_param()的参数2应该是一个引用,给定的值
我理解这个问题,我只是不确定如何解决它.
例如,可以像这样调用该函数:
$db->Insert('pictures',array('views'=>1));
Run Code Online (Sandbox Code Playgroud)
并var_dump($params)会产生这个:
array
0 => string 'i' (length=1)
1 => int 1
Run Code Online (Sandbox Code Playgroud)
那么,有没有办法mysqli::bind_param用可变数量的参数调用,或以某种方式使我的数组成为引用?
mysqli_stmt :: bind_param()手册页中的第二个注释说明:
将mysqli_stmt_bind_param()与call_user_func_array()结合使用时必须小心.请注意,mysqli_stmt_bind_param()需要通过引用传递参数,而call_user_func_array()可以接受可以表示引用或值的变量列表作为参数.
手册中的用户注释部分发布了一个解决方案.简而言之,您创建一个接受数组并返回一个重复数组的函数,该数组的元素是对源数组中元素的引用.
| 归档时间: |
|
| 查看次数: |
1863 次 |
| 最近记录: |