webForumDet fria alternativet

search.php problem

7 svar · 855 visningar · startad av Jet-li

Jet-liMedlem sedan juli 200421 inlägg
#1

Har ett problem med ett search script som inte vill ladda nästa sökträffar.
Det enda som händer är att sidan laddas om med samma 10 träffar istället för nästa 10 träffar.....
Scripte jag använder hittas nedan. Testade ett annat sök script och det var samma problem med det....

<?php
//This is a working script
//Make sure to go through it and edit database table filelds that you are seraching
//This script assumes you are searching 3 fields
$hostname_logon = "localhost" ;   
$database_logon = "databaseName" ;  
$username_logon = "databaseUser" ;  
$password_logon = "databasePass" ;   
//open database connection
 $connections = mysql_connect($hostname_logon, $username_logon, $password_logon) or die ( "Unabale to connect to the database" );
 //select database
 mysql_select_db($database_logon) or die ( "Unable to select database!" );

//specify how many results to display per page
$limit = 10;

// Get the search variable from URL
  $var = @$_GET['q'] ;
//trim whitespace from the stored variable
  $trimmed = trim($var); 
//separate key-phrases into keywords
  $trimmed_array = explode(" ",$trimmed);

// check for an empty string and display a message.
if ($trimmed == "") {
  $resultmsg =  "<p>Search Error</p><p>Please enter a search...</p>" ;
  }

// check for a search parameter
if (!isset($var)){
  $resultmsg =  "<p>Search Error</p><p>We don't seem to have a search parameter! </p>" ;
  }
// Build SQL Query for each keyword entered
foreach ($trimmed_array as $trimm){
     
// EDIT HERE and specify your table and field names for the SQL query
     $query = "SELECT * FROM tablename WHERE field1 LIKE \"%$trimm%\" OR field2 LIKE  \"%$trimm%\" OR field3 LIKE \"%$trimm%\" ORDER BY field1   DESC" ; 
     // Execute the query to  get number of rows that contain search kewords
     $numresults=mysql_query ($query);
     $row_num_links_main =mysql_num_rows ($numresults);

     // next determine if 's' has been passed to script, if not use 0.
     // 's' is a variable that gets set as we navigate the search result pages.
     if (empty($s)) {
         $s=0;
     }

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

      //store record id of every item that contains the keyword in the array we need to do this to avoid display of duplicate search result.
      do{
 //EDIT HERE and specify your field name that is primary key
          $adid_array[] = $row[ 'fieldid' ];
      }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++;
   }

// now you can display the results returned. But first we will display the search form on the top of the page
?>

<form action="search.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
// display what the person searched for.
 if( isset ($resultmsg)){
  echo $resultmsg;
  exit();
 }else{
  echo "Search results for: " . $var;
 }
 
foreach($newarr as $value){
 
// EDIT HERE and specify your table and field names for the SQL query
$query_value = "SELECT * FROM tablename WHERE fieldid = '$value'";
 $num_value=mysql_query ($query_value);
 $row_linkcat= mysql_fetch_array ($num_value);
 $row_num_links= mysql_num_rows ($num_value);

//now let's make the keywods bold. To do that we will use preg_replace function.
//EDIT parts of the lines below that have fields names like $row_linkcat[ 'field1' ]
//This script assumes you are searching only 3 fields. If you are searching more fileds make sure that add appropriate line. 
  $titlehigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'field1' ] );
  $linkhigh = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'field2' ] );
  $linkdesc = preg_replace ( "'($var)'si" , "<b>\\1</b>" , $row_linkcat[ 'field3' ] );

foreach($trimmed_array as $trimm){
    if($trimm != 'b' ){
//IF you added more fields to search make sure to add them below as well.
        $titlehigh = preg_replace( "'($trimm)'si" ,  "<b>\\1</b>" , $titlehigh);
        $linkhigh = preg_replace( "'($trimm)'si" , "<b>\\1</b>" , $linkhigh);
        $linkdesc = preg_replace( "'($trimm)'si" ,  "<b>\\1</b>" , $linkdesc); 
     }
//end highlight

?>
 <p>
<?php echo $titlehigh; ?><br>
<?php echo $linkhigh; ?><br>
<?php echo $linkhigh; ?>
</p>
 
<?php
}   //end foreach $trimmed_array 
   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>";
        }
    }
}  //end foreach $newarr
?>
The_HulkMedlem sedan juni 20031 937 inlägg
#2

var kommer $s ifrån?

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

ska det var

   $s = $_GET['s'];
   if (empty($s)) {
         $s=0;
     }
Jet-liMedlem sedan juli 200421 inlägg
#3

Tackar så mycket, det var ju det som felade :r

Jet-liMedlem sedan juli 200421 inlägg
#4

Kan ju fortsätta med den här tråden istället för att skapa en ny....

Scriptet fungerar prima förutom på en punkt och det är att om man söker med flera sökord så visas allt dubbelt. Om jag söker på "blå" och "grön" så visas dubbelt resultat även om de båda sökorden finns i en och samma text. Och söker man på "blå" och "blå" så blir det dubbelträffar där oxå. Det underliga är att antalet träffar anges till 1 fast det skapas 2 träffar på skärmen......

The_HulkMedlem sedan juni 20031 937 inlägg
#5

du loopar ju över alla sökord och gör en räkning per sökord.

foreach ($trimmed_array as $trimm){
     
// EDIT HERE and specify your table and field names for the SQL query
     $query = "SELECT * FROM tablename WHERE field1 LIKE \"%$trimm%\" OR field2 LIKE  \"%$trimm%\" OR field3 LIKE \"%$trimm%\" ORDER BY field1   DESC" ;
     // Execute the query to  get number of rows that contain search kewords

sen sparar du antalet träffar för sökningen i samma variabel

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

Antingen får du lägga samma alla räkningar eller göra om din sökning.
borde vara bättre att bara göra EN sökning på alla ord samtidigt.

     $query = "SELECT * FROM tablename WHERE ";
    $first_word = true;

     
foreach ($trimmed_array as $trimm){
if($first_word)
{
$first_word = false;
}
else
{
$query .= " OR ";
}
// EDIT HERE and specify your table and field names for the SQL query
$query .= " field1 LIKE \"%$trimm%\" OR field2 LIKE  \"%$trimm%\" OR field3 LIKE \"%$trimm%\" ";
}
     // Execute the query to  get number of rows that contain search kewords
$query .= " ORDER BY field1   DESC" ;
     $numresults=mysql_query ($query);
     $row_num_links_main =mysql_num_rows ($numresults);

Om koden fungerar 100% vet jag inte men det är kanske en start för dig.

/r
vet inte riktigt vad du försöker göra i ditt sök-skript men det ser onödigt jobbigt ut, du sparar undan några ID och plockar bort de som är dubbletter senm kör du ny sökning för varje ID längre ner i koden.

Jet-liMedlem sedan juli 200421 inlägg
#6

Jag vill kunna söka på ett eller flera sökord samtidigt utan att få upp dubbla texter...det är vad jag är ute och far efter :)
Din kod fungerar men det blir knas då man använder flera sökord....

Jet-liMedlem sedan juli 200421 inlägg
#7

Ibland så luras man att söka felen på fel ställe. Men jag lyckades iaf fixa till det och nu fungerar allt prima. Om någon annan behöver ett fungerande sök skript så finns det här....

<?php

$hostname_logon = "localhost" ;
$database_logon = "databaseName" ;
$username_logon = "databaseUser" ;
$password_logon = "databasePass" ;
//open database connection
 $connections = mysql_connect($hostname_logon, $username_logon,
$password_logon) or die ( "Unabale to connect to the database" );
 //select database
 mysql_select_db($database_logon) or die ( "Unable to select database!" );

//specify how many results to display per page
$limit = 10;

// Get the search variable from URL
  $var = @$_GET['q'] ;
//trim whitespace from the stored variable
  $trimmed = trim($var);
//separate key-phrases into keywords
  $trimmed_array = explode(" ",$trimmed);

// check for an empty string and display a message.
if ($trimmed == "") {
  $resultmsg =  "<p>Search Error</p><p>Please enter a search...</p>" ;
  }

// check for a search parameter
if (!isset($var)){
  $resultmsg =  "<p>Search Error</p><p>We don't seem to have a search
parameter! </p>" ;
  }
// Build SQL Query for each keyword entered
foreach ($trimmed_array as $trimm){
      // EDIT HERE and specify your table and field names for the SQL query
     $query = "SELECT * FROM tablename WHERE field1 LIKE '%$trimm%' OR
field2 like '%$trimm%' OR field3 like '%$trimm%' ORDER BY field1 
DESC" ;
     // Execute the query to  get number of rows that contain search kewords
     $numresults=mysql_query ($query);
     $row_num_links_main =mysql_num_rows ($numresults);

     // next determine if 's' has been passed to script, if not use 0.
     // 's' is a variable that gets set as we navigate the search result
pages.
     $s = $_GET[\'s\'];
     if (empty($s)) {
         $s=0;
     }

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

      //store record id of every item that contains the keyword in the
array we need to do this to avoid display of duplicate search
result.
      do{
          $adid_array[] = $row[ 'fieldid' ];
      }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++;
   }

// now you can display the results returned. But first we will display the
search form on the top of the page
?>

<form action="search.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
// display what the person searched for.
 if( isset ($resultmsg)){
  echo $resultmsg;
  exit();
 }else{
  echo "Search results for: " . $var;
 }

foreach($newarr as $value){
 // EDIT HERE and specify your table and field names for the SQL query
$query_value = "SELECT * FROM tablename WHERE fieldid = '$value'";
 $num_value=mysql_query ($query_value);
 $row_linkcat= mysql_fetch_array ($num_value);
 $row_num_links= mysql_num_rows ($num_value);

//now let's make the keywods bold. To do that we will use preg_replace
function.
//Replace field
  $titlehigh = preg_replace ( "'($var)'si" , "<b> //1</b>" , $row_linkcat[
'field1' ] );
  $linkhigh = preg_replace ( "'($var)'si" , "<b> //1</b>" , $row_linkcat[
'field2' ] );
  $linkdesc = preg_replace ( "'($var)'si" , "<b> //1</b>" , $row_linkcat[
'field3' ] );

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);
        $linkdesc = preg_replace( "'($trimm)'si" ,  "<b> //1</b>" ,
$linkdesc);
     }
//end highlight
}   //end foreach $trimmed_array
?>
 <p>
<?php echo $titlehigh; ?><br>
<?php echo $linkhigh; ?><br>
<?php echo $linkhigh; ?>
</p>

<?php
}   //end foreach $trimmed_array
   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>";
        }
    }
}  //end foreach $newarr
?>

/J

MickeA.comMedlem sedan feb. 20034 528 inlägg
#8

Jag använder mig av metoden ovan för att söka i en databas.
Kan man fixa så att sorteringen sker "rätt", d.v.s att de "bästa" träffarna hamnar högst upp?

Genererad på 391 ms · cache AV · v20260730165559-full.f96bc7eb