可以传递变量字符串:到stmt-> bind_param()?

时间:2017-04-04 19:27:06

标签: php prepared-statement bindparam

我处于从$ _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。

有没有简单的方法用变量的字符串来做这个?

1 个答案:

答案 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));