2012-12-10 130 views
3

想知道是否有人可以幫助我向正確的方向發展,我構建了搜索功能(php和mysql),它將顯示搜索結果並突出顯示用戶搜索的關鍵字。目前我抓住用戶輸入的搜索條件,並對數據庫進行查詢,該數據庫正常工作以獲得所需的結果。這個問題我已經是mysql和php搜索突出顯示

$highlight = preg_replace("/".$_GET['criteria']."/", "<span class='highlight'>".$_GET['criteria']."</span>", $_row['name']); 

這將只強調一個短語,而不是個別關鍵字。例如,如果文檔被稱爲「Hello world」,並且用戶完全輸入了它,它將突出顯示沒有問題,但是如果用戶鍵入「world hello」,它將不會突出顯示任何內容。我認爲這是一個好主意,採取搜索標準,並使用爆炸和單獨檢查每個單詞,但這似乎也失敗了。這裏是我的查詢,我如何顯示結果

$sql = "SELECT * 
       FROM uploaded_documents 
       WHERE dept_cat = 'procedures' 
       AND cat =:cat 
       AND keywords REGEXP :term "; 
    $result->execute(array(':cat' => $_GET['category'],':term' => $_GET['criteria'])); 

//display results 
while($row = $stmt->fetch()){ 
    $explode_criteria = explode(" ",$_GET['criteria']);    
    foreach($explode_criteria as $key){        
     $highlight = preg_replace("/".$key."/", "<span class='highlight'>".$key."</span>", $row['name']); 

      echo '<td><a target="_blank" href="'.$row['url'].'">'.$highlight.'</a></td>'; 
        echo '<td>'.$row['version'].'</td>'; 
        echo '<td>'.$row['cat'].'</td>'; 
        echo '<td>'.$row['author'].'</td>'; 

        echo '<td>'.$row['added'].'</td>'; 
        echo '<td>'.$row['auth_dept'].'</td>'; 

        echo '<td>'; 
    } 
} 

對於長的緣故,我已經在這裏省略代碼,並試圖保持最小的,我一直在試圖立足於以下崗位

我的工作highlighting search results in php/mysql

我認爲我的第一個問題是while循環中的foreach循環複製結果,但我不能想辦法繞過它。

在此先感謝

+0

這裏有什麼問題?它是不突出顯示任何內容還是僅突出顯示最後一個字? – Dale

+0

基本上發生的是,用戶輸入的最後一個單詞突出顯示,沒有其他東西 – Greyhamne

+1

在正則表達式中插入用戶字符串時,您一定要使用preg_quote()。 – flyx

回答

2

在這個代碼塊:

//display results 
while ($row = $stmt->fetch()) 
{ 
    $explode_criteria = explode(" ", $_GET['criteria']); 
    foreach ($explode_criteria as $key) 
    { 
     $highlight = preg_replace("/" . $key . "/", "<span class='highlight'>" . $key . "</span>", $row['name']); 

     echo '<td><a target="_blank" href="' . $row['url'] . '">' . $highlight . '</a></td>'; 
     echo '<td>' . $row['version'] . '</td>'; 
     echo '<td>' . $row['cat'] . '</td>'; 
     echo '<td>' . $row['author'] . '</td>'; 

     echo '<td>' . $row['added'] . '</td>'; 
     echo '<td>' . $row['auth_dept'] . '</td>'; 

     echo '<td>'; 
    } 
} 

循環不斷提及$row['name'],因此在更換完成,但下一次的循環發生它替換下一個在原始未修改$row['name']

我覺得這個詞應該幫助你:

//display results 
while ($row = $stmt->fetch()) 
{ 
    $explode_criteria = explode(" ", $_GET['criteria']); 
    $highlight = $row['name']; // capture $row['name'] here 
    foreach ($explode_criteria as $key) 
    { 
     // escape the user input 
     $key2 = preg_quote($key, '/'); 
     // keep affecting $highlight 
     $highlight = preg_replace("/" . $key2 . "/", "<span class='highlight'>" . $key . "</span>", $highlight); 

     echo '<td><a target="_blank" href="' . $row['url'] . '">' . $highlight . '</a></td>'; 
     echo '<td>' . $row['version'] . '</td>'; 
     echo '<td>' . $row['cat'] . '</td>'; 
     echo '<td>' . $row['author'] . '</td>'; 

     echo '<td>' . $row['added'] . '</td>'; 
     echo '<td>' . $row['auth_dept'] . '</td>'; 

     echo '<td>'; 
    } 
} 
+2

真棒戴爾感謝您的幫助,只是很高興有人能夠明白我的問題 – Greyhamne

+1

@Greyhamme沒問題的冠軍,這是我遇到過的問題..這麼多更容易看到別人的代碼:) – Dale