Здравствуйте! У меня есть задача: проверить, апвоутил ли "$username" запись с идентификатором "$id". Для этого я написал следующее (БД PostgreSQL):
$foo = R::getRow('SELECT "votes"::jsonb @> \'{"upvote":[":username"]}\'::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = :id', [":id"=>$id,":username"=>$username];
Проблема в том, что я получаю ошибку HY093 (судя по гуглу, эта ошибка появляется при неудачах с плейсхолдерами)
Потом я пытался экранировать кавычки внутри JSON строки, так, чтобы получилось:
\'{\"upvote"\:[\":username\"]}\'
Результат тот же.
После я пытался вообще убрать кавычки возле ":username", так, чтобы было:
\'{"upvote"\:[:username]}\'
Но получаю всю ту же ошибку.
Но, когда я не использую плейсхолдер в месте ":username", т.е, когда код выглядит так:
$foo = R::getRow('SELECT "votes"::jsonb @> \'{"upvote":["'.$username.'"]}\'::jsonb AS "is_upvoted" FROM "pages" WHERE "id" = :id', [":id"=>$id];
операция происходит успешно и я получаю свой результат. Конечно, сейчас я использую свою, проверенную переменную, но потом я хочу использовать подобный запрос для пользовательского поиска, и понимаю, что это небезопасно, поэтому хочу попросить здесь помощи: в чем причина и как это можно решить?