首页 > 解决方案 > 在 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。编写此查询的最佳方法是什么?

标签: phpmysqljsonsearch

解决方案


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();

推荐阅读