2008-08-15 115 views
7

在我即将完成的项目中,我编写并实现了一个用于PHP的对象关系映射解决方案。在怀疑者和梦想家喊出“如何在地球上?”之前,放松一下 - 我还没有找到一种方法来做出静态的静态绑定工作 - 我只是尽可能以最好的方式解决它。PHP + MYSQLI:使用预处理语句的可变参数/结果绑定

无论如何,我目前没有使用预处理语句进行查询,因为我无法想出一个办法可变数量的参数传递给bind_params()bind_result()方法。

为什么我需要支持可变数量的参数,你问?因为我的模型的超类(将我的解决方案想象成一个被破解的PHP ActiveRecord想像者)是定义查询的地方,例如find()方法不知道它需要绑定多少个参数。

现在,我已经想过创建一个参数列表并将一个字符串传递给eval(),但我不太喜欢这个解决方案 - 我宁愿只实现我自己的安全检查并传递声明。

有没有人有关于如何完成这项工作的建议(或成功案例)?如果你能帮我解决这个第一个问题,或许我们可以解决绑定结果集的问题(如果涉及初始查询来确定表结构,我怀疑会更困难,或者至少会占用更多的资源)。

回答

13

在PHP中,您可以使用call_user_func_array将可变数量的参数传递给函数或方法。一个方法的例子是:

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

该函数将被调用,数组中的每个成员都作为自己的参数传递。

+0

我认为函数名应该是`bind_param`而不是`bindparams`。至少在我的`mysqli`版本中,我使用它输入`$ stmt-> bind_param()`,而不是`$ stmt-> bindparams()`。干杯! – 2014-01-03 11:33:00

1

我不允许修改,但我相信在代码

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

在$语句前面的参考是没有必要的。由于$stmt是对象,而bindparams是该对象中的方法,所以引用不是必需的。它应该是:

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

欲了解更多信息,请参阅PHP手册上Callback Functions

0
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(); 
2

你必须确保$ array_of_params是链接数组变量,不是值mselves。应该是:

$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的警告:参数2 mysqli_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 
} 

和BOOOOOM:

call_user_func_array(array ($stmt, 'bind_param'), $bind_names); 
相关问题