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

Possible to pass string of variables: to stmt->bind_param()?

我所处的情况是从 $_GET 值动态创建 mysqli 查询,这些值总是根据所做的自定义搜索而变化。是否可以传递格式正确(动态创建)的字符串来显示相关的不同变量。

示例: $变量类型列表 = "sss"; $variablestring = "$dogs, $cats, $weasels";

$stmt->bind_param($variabletypelist, $variablestring);

因此最终结果看起来类似于

stmt->bind_param($variabletypelist,$dogs, $cats, $weasels)

我意识到这是一个问题,因为 $variablestring 被用作要绑定的变量,而不是绑定到 $dogs、$cats、$weasels。

有什么简单的方法可以用变量的字符串来做到这一点吗?

有许多使用动态数量参数调用 mysqli_stmt::bind_param 的解决方案,其中 none 涉及将列表描述为字符串,这很愚蠢。当你需要一个列表时,你可以使用 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));