對不起我的英語。我正在嘗試搜索包含主題標簽的 mysql 資料庫,但它回傳了所有內容。
例如搜索#NBA 回傳:#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";
uj5u.com熱心網友回復:
正如我在評論中所說的那樣——只用一個查詢來測驗 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 Injection 的攻擊。您應該嘗試使用引數化的預準備陳述句,而不是手動構建查詢。請參閱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]);
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/352670.html
上一篇:laravel過濾器回傳所有記錄
