如何在mysql json\u中使用pdo bindparam?

vs91vp4v  于 2021-06-20  发布在  Mysql
关注(0)|答案(1)|浏览(434)

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

$driverID = 123; 

$query = 'SELECT

* 

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

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

但是,它总是导致空匹配。删除参数并直接输入值就可以了。
我怀疑报价有问题,但我不太明白-我需要修改什么才能让它工作?

pb3skfrl

pb3skfrl1#

不能将参数占位符放在字符串分隔符内。
错误:

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:如何在jsonb上使用带双引号的绑定变量

相关问题