PDO Prepared语句的语法错误

时间:2012-03-09 19:54:00

标签: php pdo prepared-statement

我刚刚开始使用预处理语句,我的前几个例子效果很好,但现在我遇到了一个我不理解的SQL语法。我有一个执行INSERT的函数,带有一个关联数组的参数,其中数组的键是字段,数组的值是要插入的值。例如:

$arr = array("field1" => "value1",
             "field2" => "value2");

$this->insert("table", $arr);

执行:

INSERT INTO table ('field1', 'field2') VALUES ('value1', 'value2')

然而,当尝试这样做时,我收到以下错误:

  

PDOException:SQLSTATE [42000]:语法错误或访问冲突:1064   您的SQL语法有错误;检查手册   对应于您的MySQL服务器版本,以便使用正确的语法   靠近''post_title','post_body')VALUES('Testing!','1 2 3!')'at   第1行

这是我的功能:

    /**
     * insert()
     * 
     * Performs an insert query
     * 
     * @param  string $table   The table to be inserted into
     * @param  array  $fields  An associative array of the fields to be inserted
     *                         and their respective values
     * @return void
     *
     */
    function insert($table, $fields) {
        if (empty($table) || empty($fields)) {
            trigger_error('insert(): one or more missing parameters', E_USER_ERROR);
        }

        if (!is_array($fields)) {
            trigger_error('insert(): second parameter expected to be array', E_USER_ERROR);
        }

        for ($i = 0; $i < count($fields); $i++) {
            $mark[] = "?";
        }
    //(?, ?, ...)
    $mark = "(" . implode(", ", $mark) . ")";

    $bind = array_merge(array_keys($fields), array_values($fields));

    //INSERT INTO table (?, ?, ...) VALUES (?, ?, ...)
    $query = 'INSERT INTO '.$table.' '.$mark.' VALUES '.$mark;

    //Prepare and execute
    $stmt = $this->connection->prepare($query);
    var_dump($stmt);
    var_dump($bind);
    $stmt->execute($bind);
}

我打电话给:

$this->insert('post', array("post_title"=>"Testing!", "post_body"=>"1 2 3!"));

最后两个var_dump()s导致:

 object(PDOStatement)[7]
 public 'queryString' => string 'INSERT INTO post (?, ?) VALUES (?, ?)' (length=37)

array
  0 => string 'post_title' (length=10)
  1 => string 'post_body' (length=9)
  2 => string 'Testing!' (length=8)
  3 => string '1 2 3!' (length=6)

我可能错了,但据我所知,没有办法检查发送到服务器的实际查询,所以老实说我不知道​​SQL语法的来源。如果有人能指出可能出现的问题,我会非常感激。

3 个答案:

答案 0 :(得分:6)

您无法绑定标识符。所有志愿PDO布道者都不了解的事情。

您必须使用ol'good查询构建添加标识符。

将它们列入白名单,并在该列表中添加字段名称

有关完整的实施,请参阅Insert/update helper function using PDO

答案 1 :(得分:0)

字段名称应包含刻度线(``)而不是引号('')。它应该是

INSERT INTO (`field1`, `field2`) VALUES ('value1', 'value2')

答案 2 :(得分:0)

在您的SQL查询中:

INSERT INTO ('field1', 'field2') VALUES ('value1', 'value2')

你忘记了表名:

INSERT INTO table('field1', 'field2') VALUES ('value1', 'value2');