在一个项目,我将要结束,我已经写和实施对象的关系映射解决方案PHP.之前在怀疑和梦想哭出来"如何在地球上?", 放松-我还没有找到一种方法,使迟静态约束力的工作-我只是周围的工作,它在最好的办法,我所能。

无论如何,我目前不使用准备好的声明用于查询,因为我不能拿出一个方式通过一个可变数的参数 bind_params()bind_result() 方法。

为什么我需要支持一个可变数的论点,你问的?因为超类的我的模型(觉得我的解决方案作为一个侵-up PHP Email崇拜者)是的查询是定义,以便找到()方法,例如,不知道如何许多的参数,这将需要结合。

现在,我已经想建立一个参数清单和通过一串eval(),但我不喜欢这样的解决方案非常少--我宁愿只是执行我自己的安全检查,并通过发言。

没有任何人有任何建议(或者成功的故事)关于如何获得这样做?如果你可以帮我解决这一问题,我们或许可以解决结合的结果设定的(东西我怀疑将更加困难,或者至少更多的资源密集型的,如果它涉及一个初步的查询,以确定表结构)。

有帮助吗?

解决方案

在PHP你可以通过一个可变数的参数的一个函数或方法的使用 call_user_func_array.一个例子为一个方法将是:

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

该功能将被称为每个成员中的阵列的通过为其自己的论点。

其他提示

你得确保$array_of_params是列 链接的变量, 不值本身。应该是:

$array_of_params[0] = &$param_string; //link to variable that stores types

然后...

$param_string .= "i";
$user_id_var = $_GET['user_id'];//
$array_of_params[] = &$user_id_var; //link to variable that stores value

否则(如果它是一系列值)你就会得到:

PHP警告:参2mysqli_stmt::bind_param()预计将参考


一个例子:

$bind_names[] = implode($types); //putting types of parameters in a string
for ($i = 0; $i < count($params); $i++)
{
   $bind_name = 'bind'.$i; //generate a name for variable bind1, bind2, bind3...
   $$bind_name = $params[$i]; //create a variable with this name and put value in it
   $bind_names[] = & $$bind_name; //put a link to this variable in array
}

和水:

call_user_func_array( array ($stmt, 'bind_param'), $bind_names); 

我不允许编辑,但我相信,在代码

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

参考以前的$stmt是不必要的。由于 $stmt 是的对象 bindparams 是的方法,对象,基准是不必要的。它应该是:

call_user_func_array(array($stmt, 'bindparams'), $array_of_params);

更多信息,请参阅PHP手册》 回呼功能."

call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);

没有为我工作我的环境,但这个答案让我在正确的轨道。什么样的实际工作是:

$sitesql = '';
$array_of_params = array();
foreach($_POST['multiselect'] as $value){
    if($sitesql!=''){
        $sitesql .= "OR siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }else{
        $sitesql = " siteID=? ";
        $array_of_params[0] .= 'i';
        $array_of_params[] = $value;
    }
}

$stmt = $linki->prepare("SELECT IFNULL(SUM(hours),0) FROM table WHERE ".$sitesql." AND week!='0000-00-00'");
call_user_func_array(array(&$stmt, 'bind_param'), $array_of_params);
$stmt->execute();
许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top