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