在php中搜索mysql中的json数据

elcex8rz  于 2021-06-17  发布在  Mysql
关注(0)|答案(1)|浏览(371)

上次我发布了一个关于使用php搜索json数据的问题。在测试了脚本之后,我想尝试其他的东西。使用mysql搜索数据。因为它比使用php脚本循环任何东西都要快。我正在用phpmyadmin编写脚本,这为我生成了下一个php脚本。但是某处有一只虫子(悲伤)

"SELECT * 
 FROM `bigtree_pages` 
 WHERE `resources` like \'%\"XNCatDesc\": \"%?%\' and `resources` like \'%\"Brand\": \"%?%\' and `resources` like \'%\"ItemDesc\": \"%?%\'"

我想给出三个值。分类、品牌和项目描述(名称)。但这是个错误。
sql语法有错误;请检查与您的mariadb服务器版本对应的手册,以了解在“'%”xncatdesc“:”%'41“%\”和“%”附近使用的正确语法 resources 如“%”“brand”:“%”无“%”和“reso”
老实说,我真的不知道该把我的%符号放在哪里。例如。我的json里有这个 "Brand": "Bullet", 价值需要 Brand (因为我们正在搜索品牌)品牌是子弹。编写此查询的最佳方法是什么?

r1zk6ea1

r1zk6ea11#

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

如果您运行的是MySQL5.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();

相关问题