PHP-запрос: установите параметр в ключ Sql для поиска JSON - PullRequest
0 голосов
/ 07 мая 2019

У меня проблема здесь, мой код:

$query = $con2->createQueryBuilder()->select('*')
                ->from('`blog_entry`', 'p')
                ->where('WHERE url->"$.?" = ?')
                ->setParameter(0, $request->getLocale())
                ->setParameter(1, $entryUrl);

Поле url является полем JSON и содержит следующее: {"es": "url.html"}

Но появляется следующая ошибка:

SQLSTATE [HY093]: недопустимый номер параметра: количество связанных переменных не соответствует количеству токенов

Я думаю, что часть url -> "$.?" - это ошибка, но я не знаю, как передать туда параметр, есть идеи?

Ответы [ 2 ]

2 голосов
/ 07 мая 2019

Вы не можете привязать путь JSON таким образом.Из руководства :

Маркеры параметров можно использовать только там, где должны отображаться значения данных, а не для ключевых слов SQL, идентификаторов и т. Д.

Вам нужно будет изменить ваш where() вызов, чтобы вместо него включить путь, и удалить значение этого параметра:

$query = $con2->createQueryBuilder()->select('*')
                ->from('`blog_entry`', 'p')
                ->where('WHERE url->"$.' . $request->getLocale() . '" = ?')
                ->setParameter(0, $entryUrl);

Обновление

Вдохновленный FMK, я провел небольшое тестирование на своем собственном сервере и обнаружил, что это будет работать:

$query = $con2->createQueryBuilder()->select('*')
                ->from('`blog_entry`', 'p')
                ->where('WHERE JSON_EXTRACT(url, ?) = ?')
                ->setParameter(0, '"$.' . $request->getLocale() . '"')
                ->setParameter(1, $entryUrl);
0 голосов
/ 07 мая 2019

Вы пробовали что-то вроде этого:

WHERE JSON_EXTRACT('url','$.?') = '?'
...