参数号无效:绑定变量的数量与令牌PDO插入的数量不匹配

时间:2013-08-08 07:59:37

标签: pdo insert

function mysql_insert($data_array){
    $sql = "insert into `". $this->table_name. '`';

    $array_keys = array_keys($data_array);
    $array_keys_comma = implode(",\n", preg_replace('/^(.*?)$/', "`$1`", $array_keys));

    for($a=0,$b=count($data_array); $a<$b; $a++){ $question_marks .="?,";  }

    $array_values = array_values($data_array);
    $array_values_comma = implode(",", $array_values);

    $sql.= " ($array_keys_comma) ";
    $sql.= " values(". substr($question_marks, 0,-1) .")";

    $prepare = $this->connDB->prepare($sql);
    $insert = $prepare->execute(array($array_values_comma));

}

我想创建这样的通用函数,$ data_array-来自$ _POST 此功能适用于所有形式。但我不知道我错了什么:S

2 个答案:

答案 0 :(得分:0)

  

我不知道我错了什么

这很容易知道:number of bound variables does not match number of tokens.

  

我想创建这样的通用函数,$ data_array-来自$ _POST

在这里:Insert/update helper function using PDO

答案 1 :(得分:-1)

在你内爆()数组后,$ array_values_comma是一个标量。因此,您始终将一个元素的数组传递给execute()函数。你应该传递$ array_values。

以下是我写这个函数的方法:

function mysql_insert($data_array){
    $columns = array_keys($data_array);
    $column_list_delimited = implode(",", 
      array_map(function ($name) { return "`$name`"; }, $columns));

    $question_marks = implode(",", array_fill(1, count($data_array), "?"));

    $sql = "insert into `{$this->table_name}` ($column_list_delimited) 
      values ($question_marks)";

    // always check for these functions returning FALSE, which indicates an error
    // or alternatively set the PDO attribute to use exceptions

    $prepare = $this->connDB->prepare($sql);
    if ($prepare === false) {
      trigger_error(print_r($this->connDB->errorInfo(),true), E_USER_ERROR);
    }

    $insert = $prepare->execute(array_values($data_array));    
    if ($insert === false) {
      trigger_error(print_r($prepare->errorInfo(),true), E_USER_ERROR);
    }

}

进一步改进是对$this->table_name$data_array的密钥进行一些验证,以便您知道它们与现有表格及其列相匹配。

有关验证列名称的示例,请参阅my answer to escaping column name with PDO