在使用 mysqli_stmt 相关预处理SQL的方法时,调用bind_param会报一个参数不足的错误。可以采用如下方式解决,假设你有一个这样的封装:
function execute_stmt($sql_str , $params=array()){
$stmt = mysqli_stmt_prepare($link_id, $sql_str);
if ( $stmt ){
foreach($params as $k=>$v){
$array[] = &$params[$k]; //注意此处的引用
}
call_user_func_array(array($stmt, 'bind_param'), $array); // 魔术方法直接call
$stmt->execute();
...
// 若干方法
}
}
由于PHP手册上写到,这个方法是传递可变长度的参数表,因此直接传递数组的话会使其误解为单一参数。
另外,传递的$params 至少像这样写才成:
$params = array(
'ids', // 第一个参数为参数表类型串, 其中 i:整型 d:双精度 s:表示字符串 b:BLOG
1000,
200.00,
'string value'
);
如此这般,就可以使用PHP的预处理SQL了。