Avatar billede jens12 Nybegynder
30. januar 2008 - 11:03 Der er 12 kommentarer

Avanceret find bruger, med valgmuligheder.

Hej i Php eksperter/ muligvis Mysql eksperter. Jeg er lidt i tvivl hvor dette spørgsmål skal placeres.

Jeg er igang med at opbygge et Community system opbygget i Sessions, og mysql. Jeg er nu kommet til den del hvor jeg vil have en avanceret søge funktion.
Valgmulighederne skal være :

Brugernavn eller ingenting.
Alder fra XX til XX. Eller ligegyldigt.
Landsdel Midtjylland osv..Eller ligegyldigt
Køn : Dreng eller pige Eller begge.
Civilstatus : Single eller optaget eller ligegyldigt.
Som i kan se er der rigtig mange muligheder.

Jeg er kommet i tvivl hvordan jeg skal løse det. For hvis nu bruger vælger at skrive et brugernavn og undlader i resten så skal den jo kun søge på brugernavnet, osv.
Hvordan får jeg lavet det så at jeg ikke skal lave en masse if sætninger?
Jeg søger ikke et svar som er lige til at Copy'an'paste.Men hvordan jeg kan lave det smart.Kom gerne med eksempler !
Avatar billede jakobdo Ekspert
30. januar 2008 - 20:33 #1
Du kan bruge SQL funktionen: OR

Så kan den finde WHERE brugernavn LIKE '%$brugernavn%' OR landsdel = 'INGENTING' OR osv...
Avatar billede rosvall Nybegynder
31. januar 2008 - 19:07 #2
// Rens input
$r_navn = mysql_escape_string(trim($navn)); // Fjern åndssvage mellemrum og escape "farlige tegn"
$r_alder = (int)$alder; // For at være sikker på der ikke er tekst i
...


// Test for om der udfyldt mindst et felt rigtigt
if($r_navn || $r_alder || ...){
  $where_clause = "0";
  if($r_navn)
      $where_clause .= " OR navn = '$r_navn'";
  if($r_alder)
      $where_clause .= " OR alder = $r_alder";
  ....

  $sql = "SELECT ... FROM ... WHERE $where_clause";
}
Avatar billede rosvall Nybegynder
31. januar 2008 - 19:10 #3
Uh, hvis du nu vil have en eksklusiv søgning, i stedet for en inklusiv som ovenfor, så retter du
$where_clause = "0";
til
$where_clause = "1";
og ændrer OR til AND i dine $where_clause .= ...
Avatar billede jens12 Nybegynder
06. februar 2008 - 10:45 #4
Jakobdo, jeg har forsøgt mig med din metode, men når jeg prøver på at søge efter en bruger så er resultatet bare at den visser alle brugere..

Rosvall, jeg vil prøve din metode, når jeg engang kommer hjem :)
Avatar billede jens12 Nybegynder
06. februar 2008 - 11:21 #5
Rosvall, din løsning fungere heller ikke..Skal jeg poste min kode ? :)
Avatar billede rosvall Nybegynder
07. februar 2008 - 14:43 #6
Ja, gør bare det...
Avatar billede jakobdo Ekspert
07. februar 2008 - 22:00 #7
kopieret og rettet fra rosvall:

$sql = "SELECT * FROM tabel_navn";
if(isset($brugernavn) || isset($alder) || isset($landsdel) || isset($koen) || isset($civilstatus)){
    $sql .= ' WHERE 1';
    if(isset($brugernavn)){
        $sql .= " AND brugernavn LIKE '%" . $brugernavn ."%'";
    }
    if(isset($alder)){
        $sql .= " AND alder LIKE '%" . $alder ."%'";
    }
    osv...
}

$query = mysql_query($sql);
Avatar billede rosvall Nybegynder
08. februar 2008 - 00:15 #8
Har du prøvet at se på den SQL-sætning der bliver lavet? Den burde kunne give et hint om hvad der er galt.
Avatar billede jens12 Nybegynder
19. februar 2008 - 09:48 #9
Da jeg skal søge imellem alderen F.eks 14 - 17 år..
YYYY-MM-DD

Så bruger jeg denne sætning :

*,DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(age, '%Y') - (DATE_FORMAT(CURDATE(), '%m-%d') > DATE_FORMAT(age, '%m-%d')) AS alder FROM users HAVING alder BETWEEN $from AND $to.. Hvordan får jeg det lavet? Undskyld jeg har været så langsom om at svare jer.
Avatar billede jakobdo Ekspert
25. februar 2008 - 21:03 #10
Kan du ikke prøve at give et dump af din sql?
Så jeg kan se hvilke data eller ihf. bare felter du har i din tabel, så kan jeg prøve at kigge på det.
Kom også gerne med de info du ønsker søge på helt præcist.
Avatar billede jens12 Nybegynder
26. februar 2008 - 10:41 #11
SQL DUNP:
////////////////////////////////////////////////////////////////
CREATE TABLE IF NOT EXISTS `users` (
  `id` int(6) NOT NULL auto_increment,
  `brugernavn` varchar(25) NOT NULL,
  `name` varchar(15) NOT NULL,
  `age` varchar(14) NOT NULL,
  `online` varchar(1) NOT NULL default '0',
  `landsdel` varchar(2) NOT NULL,
  `sex` varchar(1) NOT NULL,
  PRIMARY KEY  (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=3 ;

Id  - brugernavn  - name    - age        - landsdel  - sex -
1-    - test1      -test1  -1990-01-28      - 16      - 1
2      - test2    -test2  - 1992-08-28    - 16      - 0
3      - test3    -test3  - 1994-01-28    - 16      - 1

Forklaring :
// Pige har værdien 1, dreng har 0.
// Landsdel har værdier fra 1 til 16
//online er 0 for offline og 1 er for online.
////////////////////////////////////////////////////////////////
POST DATA:
Felt              - type            -    Post værdier -

Brugernavn      - text box          -  bogstaver plus specieltegn som "- :"
navn            - text box          - bogstaver plus specieltegn som "- :"
Alder fra og til - 2x Drop down menu - 13 år til 18 år.
køn              - dropdown menu    - Ligegyldigt - pige - dreng
landsdel        - dropdown menu    - midtjylland, sjælland osv..
online          - dropdown menu    - ligegyldigt -Ja eller nej
////////////////////////////////////////////////////////////////
Jeg håber nu, at jeg har gjort mig forstålig nu :)
////////////////////////////////////////////////////////////////
Avatar billede jens12 Nybegynder
26. februar 2008 - 10:50 #12
Glemte en ting : Landsdel og alderen skal selvfølgelig også være ligegyldigt ..
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