Задать вопрос

Почему не работают плейсхолдеры в $connection->queryExecute?

Мой код работает:

$data['TITLE'] = $sqlHelper->forSql($data['TITLE']);
$data['PUBLISHED'] = $sqlHelper->forSql($data['PUBLISHED']);
$data['DEVELOPER'] = $sqlHelper->forSql($data['DEVELOPER']);
$data['SITE_ID'] = $sqlHelper->forSql($data['SITE_ID']);
$connection->queryExecute("INSERT INTO `test` (`TITLE`,`PUBLISHED`,`DEVELOPER`,`SITE_ID`) VALUES ('{$data['TITLE']}','{$data['PUBLISHED']}','{$data['DEVELOPER']}','{$data['SITE_ID']}')");

Но "Автоматическая проверка безопасности битрикс" в Маркетплейсе жалуется на $connection->queryExecute и предлагает заменить на

$connection->queryExecute(
    'INSERT INTO `test` (`TITLE`,`PUBLISHED`,`DEVELOPER`,`SITE_ID`) VALUES (?,?,?,?)',
    [$data['TITLE'], $data['PUBLISHED'], $data['DEVELOPER'], $data['SITE_ID']]
);

После замены получаю ошибку:

Mysql query error: (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 '?,?,?,?)' at line 1

Как решить данную проблему?
После полной инъекции переменной вплоть до банального - ИИ всё равно требует исправить.
  • Вопрос задан
  • 166 просмотров
Подписаться 2 Простой 2 комментария
Помогут разобраться в теме Все курсы
  • Нетология
    1C-программист: расширенный курс
    18 месяцев
    Далее
  • Яндекс Практикум
    Вайбкодинг
    2 месяца
    Далее
  • Академия Эдюсон
    Python-разработчик + ИИ
    9 месяцев
    Далее
Решения вопроса 1
opium
@opium
Просто люблю качественно работать
Это чекер ошибается в синтаксисе: queryExecute в Bitrix D7 ?-плейсхолдеры не понимает, MySQL их видит буквально — отсюда 1064.

Чтобы чекер перестал ругаться, нужен ORM: создай класс от DataManager и делай YourTable::add(['TITLE' => $data['TITLE'], ...]). forSql() при ORM не нужен, он сам экранирует.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

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

Похожие вопросы