【问题标题】:Why is prepared statement failing on bind_params?为什么在 bind_params 上准备好的语句失败?
【发布时间】:2019-09-10 17:12:18
【问题描述】:

我正在使用准备好的语句向我的数据库添加行。我正在重组我的代码,并且遇到了 bind_param 的问题 - 我认为它是语法问题,但无法找出问题所在。

没有为准备好的语句中的参数提供数据

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;
    }
}

【问题讨论】:

标签: php mysqli prepared-statement bindparam


【解决方案1】:

尝试使用线路

$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));

【讨论】:

  • 非常有帮助,谢谢。如果我要继续使用它,我需要大量复习我的 PHP 哈哈
猜你喜欢
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 2014-01-29
  • 2014-03-16
  • 2023-03-19
  • 2018-02-21
相关资源
最近更新 更多