2012-08-04 2 views
3

사용자가 질문을 입력 할 수있는 검색 기능을 만들면 내 코드는 이미 내 MySQL 데이터베이스에있는 질문과 가능한 많은 단어를 일치시키고 단어의 양에 따라 상위 5 개의 결과를 표시합니다 질문에서 일치.이 코드의 결과를 정렬하는 방법은 무엇입니까?

일치하는 단어의 수를 계산하는 기능을 사용하지만 표시된 결과는 50 % 이상의 단어가 일치하는 데이터베이스의 처음 5 개 결과로 표시됩니다. 나는 아래의 이미지가 무엇인지를 보여줍니다 내가

<?php 
    include("config.php"); 
    $search_term = filter_var($_GET["s"], FILTER_SANITIZE_STRING); //User enetered data 
    $search_term = str_replace ("?", "", $search_term); //remove any question marks from string 
    $search_count = str_word_count($search_term); //count words of string entered by user 
    $array = explode(" ", $search_term); //Seperate user enterd data 

    foreach ($array as $key=>$word) { 
     $array[$key] = " title LIKE '%".$word."%' "; //creates condition for MySQL query 
    } 

    $q = "SELECT * FROM posts WHERE " . implode(' OR ', $array); //Query to select data with word matches 
    $r = mysql_query($q); 
    $count = 0; //counter to limit results shown 
    while($row = mysql_fetch_assoc($r)){ 
     $thetitle = $row['title']; //result from query 
     $thetitle = str_replace ("?", "", $thetitle); //remove any question marks from string 
     $title_array[] = $thetitle; //creating array for query results 
     $newarray = explode(" ", $search_term); //Seperate user enterd data again 
     foreach($title_array as $key => $value) { 
      $thenewarray = explode(" ", $value); //Seperate each result from query 
      $wordmatch = array_diff_key($thenewarray, array_flip($newarray)); 
      $result = array_intersect($newarray, $wordmatch); 
      $matchingwords = count($result); //Count the number of matching words from 
      //user entered data and the database query 
     } 

     if(mysql_num_rows($r)==0)//no result found 
     { 
      echo "<div id='search-status'>No result found!</div>"; 
     } 
     else //result found 
     { 
      echo "<ul>"; 
      $title = $row['title']; 
      $percentage = '.5'; //percentage to take of search word count 
      $percent = $search_count - ($search_count * $percentage); //take percentage off word count 
      if ($matchingwords >= $percent){ 

       ?> 
      <li><a href='<?php echo $row['url']; ?>'><?php echo $title ?><i> &nbsp; No. matching words: <?php echo $matchingwords; ?></i></a></li> 
      <?php 

       $count++; 
       if ($count == 5) {break; 
       } 
      }else{ 
      } 
     } 
     echo "</ul>"; 
    } 
?> 

이 결과는 첫번째 최고 경기로 표시하고, 데이터베이스의 모든 결과를 아래의 방식으로 작동하지만 여기 상위 5 를 표시하는 코드입니다 싶어 검색 창에서 "내 웹 사이트를 만드는 방법"을 검색 할 때 발생합니다. 나는 이미 비슷한 질문을 던지기 위해 데이터베이스에 몇 가지 질문을하고 마지막 질문은 내가 물어 본 질문과 정확히 일치하지만 처음에는 5 개의 수학 결과를 보여 주므로 전체 일치는 무시됩니다. 다음은 그 검색 결과입니다. enter image description here

각 질문마다 얼마나 많은 단어가 일치하는지 보여주는 코드가 추가되어 조금 더 잘 작동하는지 확인할 수 있습니다. 또한 우연히 오름차순으로, 그것은 데이터베이스에서 처음 5 개의 일치하는 결과를 보여주고 있습니다.

전체 데이터베이스와 가장 일치하는 항목을 먼저 표시하고 두 번째로 가장 일치하는 항목, 세 번째 항목 등을 표시하기 위해 어떤 코드를 추가해야합니까?

+1

** 경고 ** 코드가 SQL 주입 공격에 취약하다! –

+0

다니엘 A. 화이트 부탁드립니다. – Ben

+0

코드가 쿼리 문자열에 영향을 미치지 않지만 바로 쿼리에 참여합니다. –

답변

3

count로 정렬하거나 배열 PHP 배열에 값을로드 한 다음 배열을 정렬 할 수있는 중첩 된 SQL 쿼리를 사용하십시오. SQL을 사용하면 매우 효율적입니다 & & 빠른.

Multi Dimension Array Sorting

select column1, column2,..., LENGTH(titlecolumn) - LENGTH(REPLACE(titlecolumn, '$search term', '')) AS nummatchwords from posts where " . implode(' OR ', $array) order by nummatchwords; 
+0

당신이 수에 의해 정렬 된 중첩 된 SQL 쿼리를 사용하는 예제를 보여 주시겠습니까, 나는 그 생각을했지만 didnt 할 수있는 방법을 알고 그것을 설명하는 유용한 리소스를 찾을 수 없습니다 – Ben

+0

SQL 쿼리는 내가 게시 한 것과 같을 수도 있습니다 내 대답은 :) – Robi

+0

그 SQL에서, 당신은 또한 최선의 사례로 LIMIT 5를 사용해야합니다 – Robi

관련 문제