Синтаксическая ошибка с PDO Подготовленные операторы - PullRequest
4 голосов
/ 09 марта 2012

Я только начал работать с подготовленными утверждениями, и мои первые несколько примеров работали отлично, но теперь я сталкиваюсь с синтаксисом 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! ')' в строка 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 () в конце приводят к:

 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 ]

6 голосов
/ 09 марта 2012

Вы не можете связать идентификаторы. Вещь, неизвестная всем добровольным евангелистам ЗОП.

Вы должны добавить идентификаторы, используя хорошее построение запросов.

Сделайте так, чтобы они вошли в белый список, и сделайте из этого списка предложение имен полей

См. Вставка / обновление вспомогательной функции с использованием PDO для полной реализации.

0 голосов
/ 09 марта 2012

В вашем запросе SQL:

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

Вы забыли имя таблицы:

INSERT INTO table('field1', 'field2') VALUES ('value1', 'value2');
0 голосов
/ 09 марта 2012

Имена полей должны сопровождаться галочками (``), а не кавычками ('').Это должно быть

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