为什么准备好的语句在 bind_params 上失败?

Why is prepared statement failing on bind_params?

我正在使用准备好的语句向我的数据库中添加行。我正在重组我的代码,运行 遇到了 bind_param 的问题 - 我认为它是语法问题,但无法弄清楚哪里出了问题。

No data supplied for parameters in prepared statement

function insertRow($fieldNames, $fields, $table, $link) {
    $field_names=implode(', ',$fieldNames);
    $field_values=implode(', ',$fields);
    //add question marks
    $q_marks=array();
    forEach($fieldNames as &$qm) {
        array_push($q_marks, "?");
    }
    $qs = implode(',',$q_marks);

    $stmnt = "INSERT INTO $table ($field_names) VALUES ($qs)";
    echo("<br>$stmnt<br>");
    $addrow = $link->prepare("INSERT INTO $table ($field_names) VALUES ($qs)");
    //add param types (all strings)
    $s_chars=array();
    forEach($fieldNames as &$s) {
        array_push($s_chars, "s");
    }    
    $s = implode('',$s_chars);
    echo("$s, $field_values<br>");

    $addrow->bind_param($s, $field_values);
    try {
        echo("adding row...");
        $addrow->execute();            
    } catch(Exception $e){
        echo("error: " .$e ."<br>");
        return false;
    }
}

正在尝试使用线路

$addrow->bind_param($s, $field_values);

尝试传递以逗号连接的字段列表。这实际上应该是每个值的值作为一个单独的值。这可以使用 splat 运算符 (...) 和原始字段值轻松完成...

$addrow->bind_param($s, ...$fields);

您还可以对代码的其他部分进行一些调整,而不是...

$s_chars=array();
forEach($fieldNames as &$s) {
    array_push($s_chars, "s");
}    
$s = implode('',$s_chars);

你可以直接使用

$s = str_repeat("s", count($fieldNames));