搜索不返回查询

search not returning query

对不起我的英语。我正在尝试搜索包含主题标签的 mysql 数据库,但它 returns 全部。

例如搜索#NBA returns:#NBA、#NBA2021、#NBAscoreBoard 等

我已经尝试了这里的每个 preg_replace。 eg #(^|\s)#(\w*[a-zA-Z_]+\w*)# 但是遇到具体搜索后怎么断?

$_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";

正如我在评论中所说的那样——只用一个查询来测试两个查询是否 data = fullTag,然后如果 returns 什么都没有,那么进行通配符搜索——可能会更简单。

但是,如果你真的希望这是一个单一的查询,你可以做这样的事情,你测试它是否是一个子查询中的完全匹配,然后根据它是否完全匹配来排序这样如果有完全匹配的,就是第一个结果。

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 Injection. You should try using parameterized prepared statements instead of manually building your queries. See PDO or MySQLi 准备语句的攻击。

下面是使用 PDO 的上述查询示例,this method of using 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]);