多次调用$ stmt-> bind_param

Ami*_*ein 5 php mysqli prepared-statement bindparam

我正处于这样一种情况,我想构建一个$bindParam以这种格式变量的代码:

$bindParams = [$type1 => $param1, $type2 => $param2, ... ]
Run Code Online (Sandbox Code Playgroud)

我想构建一些代码,动态地将这些参数添加到预准备语句中.
这是我到目前为止构建的代码:

$mysql = new mysqli("localhost", "root", "", "db1");
$stmt = $mysql->prepare($sql);
foreach($bindParams as $type => $data) {
    $stmt->bind_param($type, $data);
}
$stmt->execute();
$result = $stmt->get_result();
// and after perhaps twiddling with the result set, but this is not the case .....
Run Code Online (Sandbox Code Playgroud)

对于你的实例

$sql = "INSERT INTO table1 (name, age) VALUES (?,?);"
Run Code Online (Sandbox Code Playgroud)

$bindParams = ["s" => "hello", "i" => 15] 
Run Code Online (Sandbox Code Playgroud)

这并不总是有这样的结构,它可以改变为例如$bindParams = ["s" => "hello", "i" => 15, "d" => 22.5]等等$sql分别变化.

第一次编译器前往$stmt->bind_param($type, $data);firefox刷新此错误:

警告:mysqli_stmt :: bind_param():变量数量与第23行D:\ PHP\tr.php中预准备语句中的参数数量不匹配

我知道PDO支持,如页面末尾所述.但也许正如你所料,我不是PDO的粉丝所以;)
我的另一个选择是使用eval()php中可用的解决方法,但这可能是我想到的.

还有另一种方法吗?

小智 13

我有同样的问题,并找到了一个更简单的答案:

$array_of_values = array( "Brasil", "Argentina" );
$types = "ss";
$mysqli_stmt->bind_param( $types, ...$array_of_values );
Run Code Online (Sandbox Code Playgroud)

这称为"参数解包",自PHP 5.6起可用


Mac*_*ity 9

可悲的mysqli是不支持这一点.一遍又一遍地调用函数会覆盖这些值,所以当你有更多时,你只能绑定一个参数.

有几种方法可以解决这个问题

  1. 切换到PDO.您可以使用该函数调用每个函数调用一个绑定
  2. 使用call_user_func_array将params绑定为一个聚合

    $sqltype = '';
    $sqldata = [];
    foreach($bindParams as $type => $data) {
        $sqltype .= $type;
        $sqldata[] = &$data; // MUST be a reference
    }
    array_unshift($sqldata, $sqltype); // prepend the types
    call_user_func_array([$stmt, 'bind_param'], $sqldata);
    
    Run Code Online (Sandbox Code Playgroud)