php - 搜索不返回查询
问题描述
对不起我的英语。我正在尝试搜索包含主题标签的 mysql 数据库,但它返回所有。
例如搜索#NBA 返回:#NBA、#NBA2021、#NBAscoreBoard 等
我在这里尝试了所有 preg_replace 。eg #(^|\s)#(\w*[a-zA-Z_]+\w*)# 但是遇到具体搜索后怎么break呢?
$_GET["tag"]='#nba'; // $_GET is from a query string
$fulltag = preg_replace("/[^a-zA-Z0-9_]/", '', $_GET["tag"]); //trying to isolate this problem
$sql='SELECT * FROM status WHERE data LIKE "%#'.$fulltag.'%" LIMIT 12';
//
//
//
echo //the result containing the "# $fulltag";
解决方案
正如我在评论中所说的那样——只做两个查询,一个来测试 if data = fullTag
,然后如果什么都不返回,那么进行通配符搜索——可能会更简单。
但是,如果你真的希望这是一个单一的查询,你可以做这样的事情,在其中你测试它是否是一个子查询中的完全匹配,然后按它是否是一个完全匹配来排序,如果有完全匹配,这将是第一个结果。
SELECT *
FROM (
SELECT
data,
CASE
WHEN data = "#NBA"
THEN 1
ELSE 0
END AS is_exact
FROM status
WHERE data LIKE "%#NBA%"
LIMIT 12
) AS matches
ORDER BY is_exact DESC
单独说明:您现在的代码很容易受到SQL 注入的影响。您应该尝试使用参数化的预处理语句,而不是手动构建查询。请参阅PDO或MySQLi准备好的语句。
以下是使用 PDO 进行上述查询的示例,以及使用此方法CONCAT
安全地将通配符添加到查询中的方法:
$_GET["tag"]='#nba'; // $_GET is from a query string
$fulltag = preg_replace("/[^a-zA-Z0-9_]/", '', $_GET["tag"]); //trying to isolate this problem
$pdo = new PDO(/* your connection details */);
$sql =
'SELECT *
FROM (
SELECT
data,
CASE
WHEN data = CONCAT("#", :tag1)
THEN 1
ELSE 0
END AS is_exact
FROM status
WHERE data LIKE CONCAT("%#", :tag2, "%")
LIMIT 12
) AS matches
ORDER BY is_exact DESC
';
$stmt = $pdo->prepare($sql);
$stmt->execute([
':tag1' => $fulltag,
':tag2' => $fulltag,
]);
这是您使用相同、更安全的方法的更简单的查询:
$_GET["tag"]='#nba'; // $_GET is from a query string
$fulltag = preg_replace("/[^a-zA-Z0-9_]/", '', $_GET["tag"]); //trying to isolate this problem
$pdo = new PDO(/* your connection details */);
$sql = 'SELECT * FROM status WHERE data LIKE CONCAT("%#", :fullTag, "%") LIMIT 12';
$stmt = $pdo->prepare($sql);
$stmt->execute([':fullTag' => $fulltag]);
推荐阅读
- javascript - 编程语言中变量提升的优缺点是什么?
- java - 如何从 ClassName.class 获取静态最终属性?
- javascript - 使用 chrome 和平滑滚动时的奇怪滚动行为
- angular - 角度 10 - 在其他组件中加载组件
- string - 当我尝试在输出中添加字符串时,出现语法错误
- angular - 目标入口点中的错误缺少依赖项:对于子组件
- dart - 为什么即使在打印字符时控制台也是空的?
- java - 原生C调用后Android Bitmap保持不变
- android - React native - 在 Android 上启动应用程序的问题
- postgresql - Postgres表锁定删除查询