我有一个我在自定义数据库类中创建的函数。该函数旨在采用参数化SQL,清理输入并执行它。
我遇到的唯一问题是最后一条未注释的行。我有一个类型数组的变量,但我需要将数组中的每个值作为单独的参数传递。我该怎么做呢?
function do_query($sql, $values){
if(!isset($this->connect_error)){
if(tg_debug == true){
print "Query Executing! <br />";
}
$num_vals = count($values);
$i = 0;
$type = "";
while($i < $num_vals){
if(is_int($values[$i]) == true)
$type .= "i";
elseif(is_string($values[$i]) == true)
$type .= "s";
$i++;
}
$i = 0;
while($i < $num_vals){
// security stuff goes here...
$values[$i] = $this->escape_string($values[$i]);
$i++;
}
$expr = $this->prepare($sql);
print_r($values);
// $values is still an array, extract values and convert to a seperate argument
$expr->bind_param($type, $value);
//$expr->execute();
}
}
示例查询:$class->do_query("INSERT INTO
表(id, value) VALUES (?, ?)", array(3, "This is a test"));
答案 0 :(得分:1)
...
$bindParamReflection = new \ReflectionMethod($expr, 'bind_param');
$args = $values;
array_unshift($args, $type);
$bindParamReflection->invokeArgs($expr, $args);
...
答案 1 :(得分:1)
您可以使用call_user_func_array()
:
$args = $values;
array_unshift($args, $type);
call_user_func_array(array($expr, 'bind_param'), $args);
当splat operator被添加到语言中时,这将大大简化,这应该发生在5.6中:
$exp->bind_param($type, ...$values);