Я только начал работать с подготовленными утверждениями, и мои первые несколько примеров работали отлично, но теперь я сталкиваюсь с синтаксисом 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. Если бы кто-то мог указать, что может быть не так, я был бы очень признателен.