2014-06-11 74 views
0

我有一個表單,它允許用戶搜索數據庫表中的食譜,他們可以鍵入他們正在尋找的食譜的名稱,或者他們可以鍵入一些關鍵字。php mysql查詢返回基於匹配關鍵字密度的結果

我想弄清楚如何檢查記錄標題並根據關鍵字的密度百分比返回它們。所以說用戶搜索「糖醋雞」的結果會發現所有的配方首先匹配所有的單詞,然後所有的食譜與3個單詞,然後2,然後1.希望是有道理的:)

這裏是我

$keywords = mysqli_real_escape_string($con,$_POST['recipe-search']); 
$search_keywords = str_replace("and", "",$keywords); 

//Find The Latest Recipies 
$searchTerms = explode(' ', $search_keywords); 
$searchTermBits = array(); 
foreach ($searchTerms as $term) 
{ 
    $term = trim($term); 
    if (!empty($term)) 
    { 
     $searchTermBits[] = "title LIKE '%$term%'"; 
    } 
} 
$q = "SELECT * FROM tbl_recipes WHERE ".implode(' OR ', $searchTermBits); 

,檢查符合每個關鍵詞的冠軍,但它並沒有發現在標題中關鍵詞的密度。任何人都可以幫助我,我很難過!

非常感謝

+0

你應該使用'的preg_replace( '/ \ s {1,}(和\ S *)* /', '',$海峽); '這將替換多個空格,並從字符串中刪除'和'。意味着你可以刪除該循環;) –

+0

什麼讓我的查詢應該成爲「SELECT * FROM tbl_recipes WHERE title =」。 preg_replace('/ \ s {1,}(和\ s *)* /','',$ str);那是對的嗎?表情不太好。謝謝你的建議! – user2886669

+0

不,用你所查詢的'preg_replace'來代替'str_replace'應該是''SELECT * FROM tbl_recipes WHERE title IN('「.implode(」','「,$ searchTerms)。」');「;' –

回答

0

試試這個:

$keywords = mysqli_real_escape_string($con,$_POST['recipe-search']); 
$search_keywords = preg_replace('/\s{1,}(and\s*)*/', ' ', $keywords);; 

//Find The Latest Recipies 
$searchTerms = explode(' ', $search_keywords); 
$likeStr = "`title` LIKE '%" . implode("%' OR `title` LIKE '%", $search_terms) . "%'"; 

$q = "SELECT *,(SELECT COUNT(*) FROM `tbl_recipes` WHERE ". $likeStr ." GROUP BY `title`) as `count` FROM `tbl_recipes` WHERE ". $likeStr .") ORDER BY `count` DESC;"; 
+0

這個查詢似乎沒有返回任何結果,我試過幾個關鍵字,但沒有發現任何結果。我發現了$ q,這就是beig運行的查詢。 SELECT *,COUNT(*)作爲'count'從'tbl_recipes' where'title' IN('soup')ORDER BY'count' DESC;我有很多食譜中的湯這個詞?謝謝 – user2886669

+0

它似乎工作,如果它匹配IN子句中的整個標題,所以這不工作IN('奶油','西蘭花','湯'),但這是IN('奶油西蘭花湯','甜酸雞')有沒有辦法讓它工作而不必匹配整個標題?非常感謝 – user2886669

+0

嘿,已經更新了答案,很確​​定這應該起作用。 –

相關問題