Datenbank mit mehreren kriterien durchsuchen
Patrick
- php
Hallo,
ich möchte eine Suche auf meiner Seite integrieren. Es sind 5 Suchkriterien. Eine der Suchkriterien ist das das Alter und das ist auch mein problem. Wenn der User 18 eingibt sollen Mitglieder die 18 +-2 Jahre alt sind finden. Diese Mitglieder stehen in einer Datenbank. Eine abfrage nur nach alter in dieser form kann ich aber nicht wenn noch andere kriterien dazu kommen. könnt ihr mir da helfen?
Mit freundlichen Grüßen,
Patrick
Hallo Patrick,
Du meinst was in der Richtung
SELECT name, alter, geschlecht FROM user WHERE ((age>$iSucheAge-2) OR (age<$sSucheAge+2)) AND geschlecht='$sSucheGeschlecht';
Habe ich das richtig verstanden?
Schick doch mal Deinen aktuellen Query-String und ne genau Beschreibung, über welche Tabellen oder Spalten die Abfrage gehen soll...
Schöne Grüße
Alex
Hi Patrick,
ich möchte eine Suche auf meiner Seite integrieren. Es sind 5 Suchkriterien. Eine der Suchkriterien ist das das Alter und das ist auch mein problem. Wenn der User 18 eingibt sollen Mitglieder die 18 +-2 Jahre alt sind finden. Diese Mitglieder stehen in einer Datenbank. Eine abfrage nur nach alter in dieser form kann ich aber nicht wenn noch andere kriterien dazu kommen. könnt ihr mir da helfen?
Erst mal müsstest du das min und das max alter Berechnen:
//Default Werte setzen
$min_alter = 0;
$max_alter = 99;
if(is_numeric($_POST['alter'])) //Kontrollieren, ob gültige Werte überliefert wurden
{
//Wenn ja, dann Werte oben überschreiben:
$min_alter = $_POST['alter'] -2;
$max_alter = $_POST['alter'] +2;
}
//SQL Query zusammenbasteln
$sql = "SELECT
name,
nochwas
FROM
tabelle
WHERE
jahre_alt >= $min_alter && jahre_alt <= $max_alter
";
//und abschicken
$return = mysql_query($sql) OR die(mysql_error());
Habs natürlich nicht getestet, aber so in etwas könnetst du es machen. Ich hab auch direkt noch eine Kontrolle reingemacht, ob der überlieferte Wert numerisch ist.
Wäre das etwas, was dem entspräche, was du brauchst?
(Du musst die Spaltennamen natürlich noch anpassen, hab die Alters Spalte mal jahre_alt genannt, da eine Spalte in MySQL ja nicht 'alter' genannt werden darf.)
MfG, Dennis.
PS: Weiterführende Links:
Hallo,
mir ist gerade eingefallen das ich das alter als geburtsdatum in der db habe. wie kann ich das denn jetzt machen? aber eure vorschläge sind genau das was ich meine.
Mit freundlichen Grüßen,
Patrick
Hallo,
mir ist gerade eingefallen das ich das alter als geburtsdatum in der db habe. wie kann ich das denn jetzt machen?
Vorschlag: Geburtsdatumse in timestamps umwandeln. Vergleich dann in etwa so, wie dir bereits mehrfach vorgeschlagen wurde, nur halt mit timestamps.
aber eure vorschläge sind genau das was ich meine.
hä?
Grüsse
Frankie
Hallo,
das gebdatum ist im format TT.MM.JJJJ in der db. was muss ich genau machen?
Mit freundlichen Grüßen,
Patrick
Hallo,
das gebdatum ist im format TT.MM.JJJJ in der db. was muss ich genau machen?
Das ist denkbar ungünstig, da dies für MySQL kein Datum darstellt, daher mußt du den Wert erstmal in Einzelteile zerlegen.
Dazu gibt es in MySQL eine Menge geeigneter Funktionen:
http://dev.mysql.com/doc/mysql/de/String_functions.html
Jetzt "baust" du dir aus den Einzelteilen einen (gültigen) timestamp für das Geburtsdatum und vergleichst ihn z.B. mit Heute, ermittelst die Differenz in Jahren, usw.
Nützliche Funktionen dazu gibt es z.B. hier:
http://dev.mysql.com/doc/mysql/de/Date_and_time_functions.html
Wenn du noch Zeit- und Datumsfunktionen für PHP brauchst, die Beschreibung findest du u.a. hier:
http://de3.php.net/manual/de/ref.datetime.php
Wie du siehst, gibt es eine Menge Möglichkeiten dein Vorhaben umzusetzen, aber wie du es letzemdlich machst, bleibt deine Entscheidung.
Ich persönlich würde aber, bevor ich weitermache, die Geburtsdatumse erstmal in einem SQL-geeignetes Datumsformat konvertieren, spart meiner Meinung nach einiges an Arbeit.
Viel Spaß und schöne Weihnachten
Frankie
Kleine Korrektur:
Jetzt "baust" du dir aus den Einzelteilen einen (gültigen) timestamp für das
^^^^
... ein SQL-konformes Datum und ermittelst darus den timestamp ...
Grüsse
Frankie