Avatar billede straszek Praktikant
30. august 2004 - 12:21 Der er 26 kommentarer og
2 løsninger

Søgning i mysql

Jeg har en medlemsdatabase i mysql som jeg gerne vil lave en søge funktion til. Det har jeg ikke prøvet før, så jeg har brug for lidt hjælp og veåjledning til hvodan jeg laver det mest hensigtsmæssigt.

Jeg havde forestillet mig at lave en formular i php/html, med de felter det er muligt at søge i, den del har jeg styr på - men hvordan søge udtrykket skal bygges op er jeg i tvivl om.

Kan man lave det sådan at den også kan finde poster der ligner det som man søger efter - f.eks. at en søgning på brit også fandt britta?

God råd er velkommne, lige som et link til en artikel om emnet kunne være fint.

M.v.h

Søren
Avatar billede chries Nybegynder
30. august 2004 - 12:26 #1
søg efter *noget* i "felt"
SELECT * FROM tabel WHERE felt LIKE %$soeg%

søg efter noget* i "felt"
SELECT * FROM tabel WHERE felt LIKE $soeg%
Avatar billede chries Nybegynder
30. august 2004 - 12:28 #2
flere felter
SELECT * FROM tabel WHERE felt LIKE %$soeg% OR felt2 LIKE %$soeg2%

kan kombineres som man har lyst
Avatar billede kasper.h Nybegynder
30. august 2004 - 12:28 #3
Hvis du har søgeordet i $search og det felt der skal søges i i $what, kan du f.eks lave noget med
SELECT * FROM table WHERE $what LIKE '%$search%'
Hvis du så søger efter 'noget', returnerer den alle de poster hvor det felt du søger i indeholder *noget*
Avatar billede chries Nybegynder
30. august 2004 - 12:31 #4
sagtens :)
Avatar billede kasper.h Nybegynder
30. august 2004 - 12:35 #5
uhm, ja? :)
Avatar billede chries Nybegynder
30. august 2004 - 12:36 #6
ja, din query skulle virke fint :)
Avatar billede kasper.h Nybegynder
30. august 2004 - 16:39 #7
Tak, det skulle dine også.. bortset fra at du mangler et par '' omkring søgeordet ;)
Avatar billede chries Nybegynder
30. august 2004 - 16:40 #8
ups, troede det var dig der havde oprettet spørgsmålet :)
Avatar billede kasper.h Nybegynder
30. august 2004 - 16:43 #9
hehe
Avatar billede straszek Praktikant
31. august 2004 - 14:20 #10
Jeg er nu ved at forsøge mig med nedestående
$resultat = mysql_query("SELECT * FROM medlemmer WHERE medlem_fornavn LIKE %$medlem_fornavn% OR medlem_efternavn LIKE %$medlem_efternavn%") or die(mysql_error());

Men det giver denne fejl:

You have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near '%søren% OR medlem_efternavn LIKE %s%' at line 1
Avatar billede chries Nybegynder
31. august 2004 - 14:38 #11
du mangler ' ' omkring % udtrykkene som kasper påpegede '%medlem...'
Avatar billede straszek Praktikant
31. august 2004 - 14:42 #12
Det fandt jeg ud af, men har nu et andet problem.

Hvis jeg bruger: $resultat = mysql_query("SELECT * FROM medlemmer WHERE medlem_fornavn LIKE %$medlem_fornavn% OR medlem_efternavn LIKE %$medlem_efternavn%") or die(mysql_error());

Og brugeren i søge formularen kun har udfyldt 'medlem_fornavn', ja så bliver alle poster i databasen fundet, og det er jo ikke hensigtsmæssigt.

Er der en løsning på dette?
Avatar billede chries Nybegynder
31. august 2004 - 14:47 #13
hvad med:

$query = "SELECT * FROM medlemmer";

if( !empty( $medlem_fornavn ) and !empty( $medlem_efternavn ) ) {
  $query .= " WHERE medlem_fornavn LIKE '%$medlem_fornavn%' OR medlem_efternavn LIKE '%$medlem_efternavn%'";
}
else if( !empty( $medlem_fornavn ) ) {
  $query .= " WHERE medlem_fornavn LIKE '%$medlem_fornavn%'";
}
else if( !empty( $medlem_efternavn ) ) {
  $query .= " WHERE medlem_fornavn LIKE medlem_efternavn LIKE '%$medlem_efternavn%'";
}

mysql_query( $query );
Avatar billede straszek Praktikant
31. august 2004 - 14:50 #14
Det var en mulighed, men det vil hurtigt bliver uoverskueligt da jeg har 11-12 forskellige felter der kan søges på/i.

Der skulle vel ikke være en anden mulighed?

Søren
Avatar billede chries Nybegynder
31. august 2004 - 15:01 #15
har ikke lige testet :)

$fields = array( 'medlem_fornavn', 'medlem_efternavn' );

$query = "SELECT * FROM medlemmer";
$first = 1;

foreach( $fields as $field ) {
  if( !empty( $$field ) ) {
    if( $first ) {
      $first = 0;
    }
    else {
    $query. = " OR";
    }

    $query .= " ". $field ." LIKE '%". $$field ."%'";
  }
}

mysql_query( $query );
Avatar billede straszek Praktikant
31. august 2004 - 15:15 #16
Det giver en Parse error: parse error  on line 46 - som er $query. = " OR";
Avatar billede straszek Praktikant
31. august 2004 - 15:25 #17
Det var et spørgsmål om at ændre $query. = " OR"; til $query .= " OR"; - men hvordan får jeg vist outputtet?

Normalt ville jeg lave en
while ($raekke = mysql_fetch_array($resultat)) {
  extract($raekke);
echo "oplysniger her";
  }

Men det virker ikke i dette tilfælde
Avatar billede chries Nybegynder
31. august 2004 - 15:28 #18
det skulle ikke være forskel ?

$fields = array( 'medlem_fornavn', 'medlem_efternavn' );

$query = "SELECT * FROM medlemmer";
$first = 1;

foreach( $fields as $field ) {
  if( !empty( $$field ) ) {
    if( $first ) {
      $first = 0;
    }
    else {
      $query .= " OR";
    }

    $query .= " ". $field ." LIKE '%". $$field ."%'";
  }
}

$resultat = mysql_query( $query );

while ($raekke = mysql_fetch_array($resultat)) {
  extract($raekke);
echo "oplysniger her";
  }
Avatar billede straszek Praktikant
31. august 2004 - 15:35 #19
Nej det skulle man tror, men ovenstående giver denne fejl:
Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource
Avatar billede chries Nybegynder
31. august 2004 - 15:37 #20
$resultat = mysql_query( $query ) or die( "error" . mysql_error() );

hvad siger den af fejl ?
Avatar billede straszek Praktikant
31. august 2004 - 15:40 #21
Hvis jeg f.eks. søger efter palle er fejlmeddelelsen denne:

errorYou have an error in your SQL syntax. Check the manual that corresponds to your MySQL server version for the right syntax to use near 'LIKE '%Palle%'' at line 1
Avatar billede chries Nybegynder
31. august 2004 - 15:42 #22
prøv echo $query; lige før mysql_query der må være en bug der =)
Avatar billede chries Nybegynder
31. august 2004 - 15:46 #23
måske kan empty ikke tåle $$var

if( !empty( $$field ) ) {
ændres til:
if( isset( $$field ) ) {
Avatar billede straszek Praktikant
31. august 2004 - 15:47 #24
det giver SELECT * FROM medlemmer medlem_fornavn LIKE '%Palle%' så der mangler vel et where et eller andet sted?
Avatar billede chries Nybegynder
31. august 2004 - 15:48 #25
he =)

    if( $first ) {
      $first = 0;
    }
    else {
      $query .= " OR";
    }

ændres til:

    if( $first ) {
      $first = 0;
      $query .= " WHERE";
    }
    else {
      $query .= " OR";
    }
Avatar billede chries Nybegynder
31. august 2004 - 16:03 #26
og behold !empty delen =)
Avatar billede straszek Praktikant
31. august 2004 - 17:20 #27
Det ser ud til at virke, men ved du om det er muligt at justere tolerance i LIKE? - en søgning på peter i fornavn og f i efternavn, finder peter frandsen og peter kofoed.....
Avatar billede chries Nybegynder
01. september 2004 - 13:19 #28
du kan bruger AND istedte for OR

$query .= " OR";

->

$query .= " AND";
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
Computerworld tilbyder specialiserede kurser i database-management

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