Как использовать PDO bindParam внутри MySQL JSON_CONTAINS? - PullRequest
0 голосов
/ 29 августа 2018

Я пытаюсь запустить следующее:

$driverID = 123; 

$query = 'SELECT
*
FROM cars
WHERE JSON_CONTAINS(`data`, \'{"drivers": [{"driverID": ":driverID"}]}\');';

$statement = $db->prepare($query);
$statement->bindParam(':driverID', $driverID);
$result = $statement->execute();

Однако это всегда приводит к пустому совпадению. Удаление параметра и ввод значения напрямую работает нормально.

Я подозреваю, что есть проблема с кавычками, но я не могу понять это - что мне нужно изменить, чтобы заставить это работать?

1 Ответ

0 голосов
/ 29 августа 2018

Запрещается помещать заполнитель параметра в разделители строк.

НЕПРАВИЛЬНО:

SELECT * FROM MyTable WHERE mycolumn = ':param'

RIGHT:

SELECT * FROM MyTable WHERE mycolumn = :param

Хороший обходной путь - это построить строку JSON в коде приложения и затем связать всю строку JSON с параметром.

$driverID = 123; 
$obj = ['drivers' => [['driverId' => $driverID]]];
$json = json_encode($obj);

$query = 'SELECT
*
FROM cars
WHERE JSON_CONTAINS(`data`, :json);';

$statement = $db->prepare($query);
$result = $statement->execute(['json'=>$json]);

Использование json_encode() - хороший способ убедиться, что данные находятся в допустимом формате JSON. Он защищает вас от случайных синтаксических ошибок.

Смотрите очень похожий случай (хотя для PostgreSQL) здесь: Rails ActiveRecord: как использовать переменные связывания с двойными кавычками на jsonb

...