首页 > 解决方案 > 搜索不返回查询

问题描述

对不起我的英语。我正在尝试搜索包含主题标签的 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";

标签: phpregexhashtag

解决方案


正如我在评论中所说的那样——只做两个查询,一个来测试 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 注入的影响。您应该尝试使用参数化的预处理语句,而不是手动构建查询。请参阅PDOMySQLi准备好的语句。

以下是使用 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]);

推荐阅读