使用PHP在MySQL中搜索JSON数据

时间:2018-12-30 19:54:49

标签: php mysql json search

我上次发布有关搜索JSON data using PHP的问题。测试脚本后,我想尝试其他方法。使用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。编写此查询的最佳方法是什么?

1 个答案:

答案 0 :(得分:1)

要在准备好的查询中的LIKE表达式内使用参数,您需要形成整个表达式并将其用作参数。否则,就像在值中插入引号一样,您会遇到问题。如果您使用的是mysqli,请尝试类似的操作(假设您的连接称为$conn,而要搜索的值称为$categorie$brand和{{1 }}):

$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时您可以匹配例如< / p>

brand = X

因此,您应该使用正则表达式,例如

"Brand": "Y", "Other Value": "contains an X"

如果您运行的是MySQL 5.7或更高版本,最好使用内置的JSON_EXTRACT函数:

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