我处于从$ _GET值动态创建mysqli查询的情况下,这些值总是根据自定义搜索而变化。是否可以传递正确格式化(并动态创建)的字符串以显示有问题的不同变量。
实施例: $ variabletypelist =" sss&#34 ;; $ variablestring =" $ dogs,$ cats,$ weasels&#34 ;;
$stmt->bind_param($variabletypelist, $variablestring);
这样最终结果看起来与
类似stmt->bind_param($variabletypelist,$dogs, $cats, $weasels)
我意识到存在这个问题,因为$ variablestring被视为要绑定的变量,而不是绑定到$ dogs,$ cats,$ weasels。
有没有简单的方法用变量的字符串来做这个?
答案 0 :(得分:2)
有许多解决方案可以使用动态数量的参数调用mysqli_stmt::bind_param
,其中没有一个涉及将列表描述为字符串,这只是愚蠢的。如果需要列表,请使用array。
您可以使用call_user_func_array()
来调用PHP中的任何函数,指定它应该在数组中调用的参数。它会产生一个问题,因为mysqli_stmt::bind_param
的参数必须作为参考而不是值传递,但可以进行变通。
示例:
$vars = [$dogs, $cats, $weasels];
$refs = [$variabletypelist];
foreach ($vars as &$val)
$refs[] = &$val;
call_user_func_array([$stmt, 'bind_param'], $refs);
如果此语法看起来令人困惑,您也可以使用此方法的非oop版本:
$vars = [$dogs, $cats, $weasels];
$refs = [$stmt, $variabletypelist];
foreach ($vars as &$val)
$refs[] = &$val;
call_user_func_array('mysqli_stmt_bind_param', $refs);
也可以使用ReflectionClass()
来完成(我没有测试)显然不需要修改引用:
$vars = [$dogs, $cats, $weasels];
$ref = new \ReflectionClass('mysqli_stmt');
$met = $ref->getMethod('bind_param');
$met->invokeArgs($stmt, array_merge([$variabletypelist], $vars));