Jump to content

Archived

This topic is now archived and is closed to further replies.

Truz

Search engine not working properly

Recommended Posts

Hey all I found this Tutorial [url=http://www.devpapers.com/article/306]http://www.devpapers.com/article/306[/url] which show a really easy way to do a database search engine and it works perfectly....well maybe not that "perfectly" ;D.
The problem is that when I search Names of people in my database it gets all messed up since it returns the same name Repeated for each part of the name searched so I was Wondering if anyone could help me I’ve made an example you can find it here [url=http://oskulostudios.com/example/searchexample.php]http://oskulostudios.com/example/searchexample.php[/url] just type "Rodrigo" in the search box to see how it does work if you search only one word at the time and then search for "Rodrigo Example" to see the bug that returns the same database name twice for each name like this:

-Rodrigo Example

-Rodrigo Example

And if you add another word to the search like "Rodrigo Example 3" it returns each record three times.
I'm also pasting the example code below. Thanks I appreciate any replies.

[code=php:0]
<?PHP

$limit = 5;

  $var = @$_GET['q'] ;
  $trimmed = trim($var); 
  $trimmed_array = explode(" ",$trimmed); 

if ($trimmed == "") {
  $resultmsg =  "<p>Search Error</p><p>Please enter a search...</p>" ;
  }

if (!isset($var)){
  $resultmsg =  "<p>Search Error</p><p>We don't seem to have a search parameter! </p>" ;
  }
foreach ($trimmed_array as $trimm){
     
    $query = "SELECT * FROM table WHERE user LIKE \"%$trimm%\" OR name LIKE  \"%$trimm%\" ORDER BY user DESC" ; 

    $numresults=mysql_query ($query);
    $row_num_links_main =mysql_num_rows ($numresults);


    if (empty($s)) {
        $s=0;
    }

      $query .= " LIMIT $s,$limit" ;
      $numresults = mysql_query ($query) or die ( "Couldn't execute query" );
      $row= mysql_fetch_array ($numresults);

      //This is supposed to store record id of every item that contains the keyword in the array to avoid display of duplicate search result.
      do{
          $adid_array[] = $row[ 'userno' ];
      }while( $row= mysql_fetch_array($numresults));
} //end foreach

if($row_num_links_main == 0 && $row_set_num == 0){
  $resultmsg = "<p>Search results for:" . $trimmed  ."</p><p>Sorry, your search returned zero results</p>" ;
}
  //delete duplicate record id's from the array. To do this we will use array_unique function
  $tmparr = array_unique($adid_array); 
  $i=0; 
  foreach ($tmparr as $v) { 
      $newarr[$i] = $v; 
      $i++; 
  } 

?>

<form action="searchexample.php" method="get" name="search">
  <div align="center">
      <input name="q" type="text" value=" <?php echo $q; ?> " size="15"> 
      <input name="search" type="submit" value="Search">
  </div>
</form>

<?php
if( isset ($resultmsg)){
  echo $resultmsg;
  exit();
}else{
  echo "Search results for: " . $var;
}
 
foreach($newarr as $value){
 
$query_value = "SELECT * FROM table WHERE userno = '$value'";
$num_value=mysql_query ($query_value);
$row_linkcat= mysql_fetch_array ($num_value);
$row_num_links= mysql_num_rows ($num_value);

$row_linkcat[ 'field1' ]
 
  $titlehigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'user' ] );
  $linkhigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'nombre' ] );

foreach($trimmed_array as $trimm){
    if($trimm != 'b' ){
        $titlehigh = preg_replace( "'($trimm)'si" ,  "<b>\\1</b>" , $titlehigh);
        $linkhigh = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $linkhigh); 
    }


?>
<p>
<?php echo $titlehigh; ?><br>
<?php echo $linkhigh; ?><br>
</p>
 
<?php 
}  //end foreach $trimmed_array 
}  //end foreach $newarr
  if($row_num_links_main > $limit){
  // next we need to do the links to other search result pages
      if ($s>=1) { // do not display previous link if 's' is '0'
        $prevs=($s-$limit);
        echo "<div align='left'><a href='$PHP_SELF?s=$prevs&q=$var&catid=$catid'>Previous " .$limit. "</a></div>";
      }
    // check to see if last page
    $slimit =$s+$limit;
      if (!($slimit >= $row_num_links_main) && $row_num_links_main!=1) {
    // not last page so display next link
          $n=$s+$limit;
          echo "<div align='right'><a href='$PHP_SELF?s=$n&q=$var&catid=$catid'>Next " .$limit. "</a></div>";
        }
    } 

?>
[/code]

Share this post


Link to post
Share on other sites
change

echo "Search results for: " . $var;

to

echo "Search results for: " . $trimm;

as $var is the whole variable $_GET['q'] and by the looks of it what you want is just

Search results for: Rodrigo
Search results for: Example

Which using $trimm holds :)

Regards
Liam

Share this post


Link to post
Share on other sites
Hey shocker-z thanks for the reply but that didn't work since the problem is not in the "search results for:" part cause that only echoes the same text that you searched for, that is ok, the problem is that for some reason every word you add in the search sends back the information about the same person repeated the same number of times as the words in the search. For example let say you search for James Summers so in the results you'll get

------------------------------------

Search results for: [b]James Summers[/b]

-User:JS
-Name: [b]James[/b] Summers

-User:JS
-Name: [b]James Summers[/b]

-User:PS
-Name: Peter [b]Summers[/b]

-User:PS
-Name: Peter [b]Summers[/b]

---------------------------------
As you can see it returns not only the exact matching words twice (or as many times as words) but also it returns other registries that have one of the searched words twice (or as many times as words) ???.
Hope this make the problem clearer thanks
;D

Share this post


Link to post
Share on other sites

×

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.