Avatar billede ofirpeter Nybegynder
25. juli 2006 - 13:49 Der er 6 kommentarer og
1 løsning

Søgning på flere ord mysql/php

Jeg har lavet følgende script til søgninger i min databasen:
Database ser således ud:

annonce
-------
id
tekst
overskrift

soeg.php
-------
<?
if($_POST["soeg"]){
    $search = $_REQUEST["search"];
    $hent = mysql_query("SELECT * FROM annonce where tekst LIKE '%$search%' OR overskrift LIKE '%$search%'")or die(mysql_error());
    while ($hent_row = mysql_fetch_array($hent)){
        echo $hent_row["overskrift"];
    }
}
?>

Det fungerer rigtig godt, så længe at jeg kun søger på et ord. Når jeg søger på flere ord, skal det stemme præcis med hvordan ordene står i databasen.

eks:
Hvis vi har en værdi i basen der er "Super flot cykel".

Nu vil jeg ved søgning på "flot cykel" få det ønskede resultat.
Ved en søgning på "Super cykel" vil jeg dog ikke få noget resultat.

Hvordan løser jeg dette problem? Jeg synes at kunne huske at man i nogle systemer laver en word_list som man så søger i. Synes bare det virker meget omfattende at skulle dele alt tekst op i enkelte ord. (Kan selvfølgelig gøres automatisk, men vil stadig kræve nogle krafter)

Med venlig hilsen
Peter
Avatar billede kinderaeg Nybegynder
25. juli 2006 - 14:23 #1
Hvis du gør noget ala nedenstående, er det faktisk ikke så svært, så skal du bare duplikere det for overskriften også.

$tmp = "(";
$arr = explode(" ", trim($search));
foreach($arr as $sstring) {
  if($sstring>" ") {
    $tmp .= "`tekst` LIKE '%" . $sstring . "%' OR ";
  }
}
$tmp = substr($tmp, 0, -4);
$tmp .= ") ";
Avatar billede ofirpeter Nybegynder
25. juli 2006 - 15:09 #2
Hej, er der en der kan forklare mig hvad der sker? Evt. kinderaeg :)
Avatar billede kinderaeg Nybegynder
25. juli 2006 - 15:10 #3
explode deler din streng ($search). I dette tilfælde på mellemrum (" ") og smider det hele i et array. Derefter løber den arrayet igennem og laver en ny LIKE for hvert ord.
Avatar billede kinderaeg Nybegynder
25. juli 2006 - 15:16 #4
Din kode vil altså komme til at se ca. sådan her ud:

if($_POST["soeg"]){
  $search = $_REQUEST["search"];
  $sql = "SELECT * FROM annonce WHERE ";
  $tmp = "(";
  $arr = explode(" ", trim($search));
  foreach($arr as $sstring) {
    if($sstring>" ") {
      $tmp .= "`tekst` LIKE '%" . $sstring . "%' OR ";
    }
  }
  $tmp = substr($tmp, 0, -4);
  $tmp .= ") ";
  $sql .= $tmp;
  $tmp = "(";
  foreach($arr as $sstring) {
    if($sstring>" ") {
      $tmp .= "`overskrift` LIKE '%" . $sstring . "%' OR ";
    }
  }
  $tmp = substr($tmp, 0, -4);
  $tmp .= ") ";
  $sql .= " OR $tmp";
  $hent = mysql_query($sql)or die(mysql_error());
  while ($hent_row = mysql_fetch_array($hent)){
    echo $hent_row["overskrift"];
  }
}
Avatar billede ofirpeter Nybegynder
25. juli 2006 - 16:17 #5
Det ser ret fornuftigt ud! :) Smart. Jeg ønsker at alle ordene i søgestrengen skal indgå, og ikke bare et af dem. Jeg har blot ændre de to første OR -> AND.
Så det ser således ud (Håber ikke der skulle være noget galt i det):

<?
if($_POST["soeg"]){
  $search = $_REQUEST["search"];
  $sql = "SELECT * FROM annonce INNER JOIN tekster ON annonce.tekstid = tekster.tekstid WHERE ";
  $tmp = "(";
  $arr = explode(" ", trim($search));
  foreach($arr as $sstring) {
    if($sstring>" ") {
      $tmp .= "`tekst` LIKE '%" . $sstring . "%' AND ";
    }
  }
  $tmp = substr($tmp, 0, -4);
  $tmp .= ") ";
  $sql .= $tmp;
  $tmp = "(";
  foreach($arr as $sstring) {
    if($sstring>" ") {
      $tmp .= "`overskrift` LIKE '%" . $sstring . "%' AND ";
    }
  }
  $tmp = substr($tmp, 0, -4);
  $tmp .= ") ";
  $sql .= " OR $tmp";
  $hent = mysql_query($sql)or die(mysql_error());
  while ($hent_row = mysql_fetch_array($hent)){
    echo $hent_row["overskrift"];
    echo "<br>";
  } echo "<hr>";
}
?>
Avatar billede ofirpeter Nybegynder
25. juli 2006 - 16:20 #6
Jeg siger et stort tak for hjælpen kinderaeg, du må meget gerne svare.
Avatar billede kinderaeg Nybegynder
26. juli 2006 - 09:07 #7
Svar
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester