我上次发布有关搜索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。编写此查询的最佳方法是什么?
答案 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();