如何在MySQL JSON_CONTAINS中使用PDO bindParam?

时间:2018-08-28 21:00:03

标签: mysql json pdo mysql-json

我正在尝试运行以下命令:

$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 :(得分:0)

您永远不能在字符串定界符中放置参数占位符。

错误:

SELECT * FROM MyTable WHERE mycolumn = ':param'

右:

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: How to use bind variables with double quotes on jsonb