Почему PDO выдаёт фатальную ошибку?

Есть функция, по вызову которой производится
INSERT INTO `table`(`key1`, `key2`) VALUES('value1', 'value2')
.

Было решено передавать функции ключи и значения аргументами типа "string".
В итоге, получаю:
Fatal error: Uncaught PDOException: SQLSTATE[42000]
Fatal error: Uncaught 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 ''`name`, `desc`, `queue`, `slug`, `color`, `thumb`, `name__price_1`, `name__pric' at line 1 in X:\domains\cm.ru\core.php:171 Stack trace: #0 X:\domains\cm.ru\core.php(171): PDOStatement->execute() #1 X:\domains\cm.ru\app\sections.php(158): cmSections->createData() #2 {main} thrown in X:\domains\cm.ru\core.php on line 171


Ума не приложу, что там не так.
Строка 171 файла «core.php» с предвещающей ей 170-й:<br />
$query = $qpdo->prepare("INSERT INTO `sections`(:keys) VALUES(:values) LIMIT 1");
return $query->execute(array(':keys' => $keys, ':values' => $values));

$keys — первый аргумент нижеприведённой функции createData(), а $values — второй.

Строка 158 файла «sections.php»:<br />
$sections->createData('`name`, `desc`, `queue`, `slug`, `color`, `thumb`, `name__price_1`, `name__price_2`, `name__prm_1`, `name__prm_2`, `date_create`, `date_update`, `owner`', '' . $_POST['name'] . ', ' . $_POST['desc'] .', ' . $_POST['queue'] . ', ' . $_POST['slug'] . ', ' . $_POST['slug'] . ', ' . $_POST['color'] . ', ' . $_POST['thumb'] . ', ' . $_POST['name__price_1'] . ', ' . $_POST['name__price_2'] . ', ' . $_POST['name__prm_1'] . ', ' . $_POST['name__prm_2'] . ', ' . date('Y-m-d h:i:s') .', ' . date('Y-m-d h:i:s') . ', ' . $_COOKIE['user__id'] . '');
  • Вопрос задан
  • 2583 просмотра
Пригласить эксперта
Ответы на вопрос 4
@MaLuTkA_UA
С помощью подготовленных запросов нельзя вставлять колонки. Прочтите документацию как использовать PDO
Ответ написан
Комментировать
@vatai
Вам выдаёт ошибку SQLSTATE[42000] , код 42000 это синтаксическая ошибка запроса.
Попробуйте сначала сделать идентичный запрос в БД , но напрямую , а не из кода и в запросе указать что должно вставляться на место переменных(Любые тестовые значения , главное чтобы INSERT INTO сработал и внёс записи в таблицу)
Если сработает , то значит значения переменных отправляются не в правильном формате , например вместо string в переменной находится array , в этом случае проверяйте переменные через var_dump()
Ответ написан
Комментировать
Rsa97
@Rsa97
Для правильного вопроса надо знать половину ответа
Плейсхолдерами заменяются только единичные данные. Имена баз, таблиц и колонок, ключевые слова, списки данных плейсхолдерами не заменяются.
Ответ написан
Комментировать
ThunderCat
@ThunderCat Куратор тега PHP
{PHP, MySql, HTML, JS, CSS} developer
1) Ключи не могут задаваться плейсхолдерами
2) Данные должны передаваться по отдельности, в этом весь смысл подготовленных выражений.
Запрос сначала создается, а потом в места обозначенные плейсхолдерами можно передавать любую строку, она будет воспринята именно как строка, и не возникнет проблем с символами, задающими какие-то значимые настройки в запросе. То есть подготовленные выражения четко разделяют запрос и данные, во избежания путаницы со спец символами.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы