2012-03-09 4 views
4

Я только начал работать с подготовленными инструкциями, и мои первые несколько примеров получились отличными, но теперь я столкнулся с синтаксисом SQL, который я не понимаю. У меня есть функция, которая выполняет INSERT, принимая параметр ассоциативного массива, где ключом массива является поле, а значение массива - значение, которое нужно вставить. Например:Ошибка синтаксиса с PDO Подготовленные утверждения

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

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

бы выполнить:

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

Однако, при попытке сделать это, я получаю следующее сообщение об ошибке:

PDOException: SQLSTATE[42000]: Syntax error or access violation: 1064 You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''post_title', 'post_body') VALUES ('Testing!', '1 2 3!')' at line 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. Если бы кто-нибудь мог указать, что может быть неправильно, я был бы признателен за это.

+0

Где находится табло в вашем запросе? – PeeHaa

+1

Вы _cannot_ укажите имена полей, как это. Явные имена полей не являются строками или целыми числами, они являются идентификаторами. Если вы _really_ уверены в именах столбцов, первая '$ mark' может быть' implode (',', array_keys ($ fields); '. Я бы все еще сохранил список этих полей ... – Wrikken

+1

Также: имейте в виду PDO _emulates_ готовит/выдает данные в определенных условиях, если не указано иное. – Wrikken

ответ

6

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

Вы должны добавить идентификаторы, используя ol'good query building.

У них белый список и сделать оговорку имен полей из этого списка

См Insert/update helper function using PDO для полной реализации.

+0

Вы правы, я просто заменил знаки? имена реальных полей, и теперь это работает. Мне нужно помнить об этом сейчас! –

0

Имена полей должны быть отмечены тиками (``) не указаны (''). Он должен быть

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

В ваш запрос:

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

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

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

К сожалению, это была опечатка, в var_dump внизу вы должны увидеть, что я включил имя таблицы. –

Смежные вопросы