开发者社区 问答 正文

PHP + MYSQLI:具有准备好的语句的可变参数/结果绑定

在我即将结束的项目中,我编写并实现了PHP的对象关系映射解决方案。在怀疑者和梦想家大喊“到底怎么了?”之前,放松一下-我还没有找到一种方法来进行后期的静态绑定工作-我只是以自己可能的最佳方式进行解决。

无论如何,我目前不使用准备好的语句进行查询,因为我无法提出一种将可变数量的参数传递给bind_params()or bind_result()方法的方法。

您问为什么我需要支持可变数量的参数?因为我的模型的超类(将我的解决方案看作是经过黑客攻击的PHP ActiveRecord的想像)是定义查询的位置,因此例如find()方法不知道需要绑定多少个参数。 。

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

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

问题来源于stack overflow

展开
收起
保持可爱mmm 2019-11-15 15:21:32 543 分享 版权
1 条回答
写回答
取消 提交回答
  • 您必须确保$ 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警告:mysqli_stmt :: bind_param()的参数2应该是引用

    再举一个例子:

    $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);

    2019-11-15 15:21:41
    赞同 展开评论