1
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

4

2 回答 2

0

我不知道我怎么了

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

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

给你:使用 PDO 插入/更新辅助函数

于 2013-08-08T08:04:42.450 回答
-1

$array_values_comma 是 implode() 数组后的标量。所以你总是将一个元素的数组传递给你的 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以便您知道它们与现有表及其列匹配。

有关验证列名的示例,请参阅我对使用 PDO 转义列名的回答。

于 2013-08-08T08:04:31.330 回答