PHP + MYSQLI:具有准备好的语句的可变参数/结果绑定
时间:2020-03-05 18:39:58 来源:igfitidea点击:
在我即将结束的项目中,我为PHP编写并实现了对象关系映射解决方案。在怀疑者和做梦者大喊"到底怎么了?"之前,放松一下-我还没有找到一种方法来进行后期的静态绑定工作-我只是以自己可能的最佳方式进行解决。
无论如何,我目前没有使用准备好的语句进行查询,因为我无法提出一种将可变数量的参数传递给bind_params()或者bind_result()方法的方法。
我们问为什么我需要支持可变数量的参数?因为我模型的超类(将我的解决方案看作是经过黑客攻击的PHP ActiveRecord的想像)是定义查询的地方,所以例如find()方法不知道需要绑定多少个参数。
现在,我已经考虑过构建一个参数列表并将字符串传递给eval(),但是我不太喜欢这种解决方案-我宁愿只是实现自己的安全检查并传递语句。
有人对完成这项工作有任何建议(或者成功案例)吗?如果我们可以帮助我解决第一个问题,也许我们可以解决绑定结果集的问题(我怀疑这会更困难,或者如果涉及用于确定表结构的初始查询,则至少会占用更多资源)。
解决方案
回答
在PHP中,我们可以使用call_user_func_array
将可变数量的参数传递给函数或者方法。方法的一个示例是:
call_user_func_array(array(&$stmt, 'bindparams'), $array_of_params);
该函数将以数组中的每个成员作为其自变量传递的方式被调用。
回答
我不允许编辑,但我相信代码
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();