php - 在 PHP 中搜索 MySQL 中的 JSON 数据
问题描述
上次我发布了一个关于使用 PHP 搜索 JSON 数据的问题。在测试了脚本之后,我想尝试其他的东西。使用 MySQL 搜索数据。因为它比使用 PHP 脚本循环所有内容要快。我在 PhpMyAdmin 中编写脚本,它为我生成了下一个 PHP 脚本。但是某处有一个错误(悲伤)
"SELECT *
FROM `bigtree_pages`
WHERE `resources` like \'%\"XNCatDesc\": \"%?%\' and `resources` like \'%\"Brand\": \"%?%\' and `resources` like \'%\"ItemDesc\": \"%?%\'"
我想给出三个值。类别、品牌和 ItemDesc(名称)。但这会引发错误。
您的 SQL 语法有错误;检查与您的 MariaDB 服务器版本相对应的手册,以了解在 '\'%"XNCatDesc": "%'41'%\' 和
resources
类似 \'%"Brand": "%'none'%\'附近使用的正确语法和`reso'
老实说,我真的不知道我必须把我的 % 符号放在哪里。例如。我在我的 JSON 中有这个"Brand": "Bullet",
值需要是Brand
(因为我们正在搜索品牌)并且品牌是 Bullet。编写此查询的最佳方法是什么?
解决方案
要LIKE
在准备好的查询中使用表达式内的参数,您需要形成整个表达式并将其用作参数。否则,您会遇到在值中插入引号时遇到的问题。如果您正在使用mysqli
,请尝试这样的操作(假设您的连接被调用$conn
并且您要搜索的值被调用$categorie
,$brand
并且$itemdesc
):
$stmt = $conn->prepare("SELECT *
FROM `bigtree_pages`
WHERE `resources` like ? and `resources` like ? and `resources` like ?");
$search_categorie = "%\"XNCatDesc\": \"%$categorie%\"";
$search_brand = "%\"Brand\": \"%$brand%\"";
$search_itemdesc = "%\"ItemDesc\": \"%$itemdesc%\"";
$stmt->bind_param("sss", $search_categorie, $search_brand, $search_itemdesc);
$stmt->execute();
但是,您将遇到的问题是,由于查询中%
的搜索值(例如$brand
)在搜索时brand = X
可能会匹配,例如
"Brand": "Y", "Other Value": "contains an X"
因此,您应该使用正则表达式,例如
$stmt = $conn->prepare("SELECT *
FROM `bigtree_pages`
WHERE `resources` rlike ? AND `resources` rlike ? AND `resources` rlike ?");
$search_categorie = '"XNCatDesc":[[:space:]]+"[^"]*' . $categorie;
$search_brand = '"Brand":[[:space:]]+"[^"]*' . $brand;
$search_itemdesc = '"ItemDesc":[[:space:]]+"[^"]*' . $itemdesc;
$stmt->bind_param("sss", $search_categorie, $search_brand, $search_itemdesc);
$stmt->execute();
如果您运行的是 MySQL 5.7 或更高版本,最好使用内置JSON_EXTRACT
函数:
$stmt = $conn->prepare("SELECT *
FROM `bigtree_pages`
WHERE JSON_EXTRACT(`resources`, '$.XNCatDesc') LIKE ? and
JSON_EXTRACT(`resources`, '$.Brand') LIKE ? and
JSON_EXTRACT(`resources`, '$.ItemDesc') LIKE ?");
$search_categorie = "%$categorie%";
$search_brand = "%$brand%";
$search_itemdesc = "%$itemdesc%";
$stmt->bind_param("sss", $search_categorie, $search_brand, $search_itemdesc);
$stmt->execute();
推荐阅读
- function - Julia - 如何将 kwargs 从函数传递给宏
- c# - C#/Flatbuffers - 如何将 ByteBuffer 制作成 byte[] 并在其前面加上 ushort
- ssl - 自定义 (https) 标头是一种安全的 API 身份验证方法吗?
- javascript - 绝对元素随着 div 的滚动而滚动
- bash - 如何在shell中提取ID之间的字符串
- python - 为嵌套在多个文件夹中的数据创建训练、测试拆分
- postgresql - PSQL 组 row_to_jjson 输出
- r - How to estimate the density (empirical pdf) from quantiles (the empirical CDF) in R
- javascript - How can I call my Calculator to popup on click, at my website with a Javascript function?
- bash - Shell Variable in awk regexp