ausgabe filtern

TaxiDriver

Mitglied
Mein Problem: Ich hab in der Datenbank eine Tabelle user, wo vorname, name, email UND geburtsdatum vorhanden sind. Jetzt möchte ich den anderen Usern die möglichkeit geben, nach bestimmten leuten zu suchen. Soweit auch alles kein Problem, NUR... Man sollte die Suche auf das Alter einschränken können... also z.B. SUCHE USER WO MINDESTENS 23 UND HÖCHSTENS 35 IST. Da aber das Geburtsdatum (im Format dd.mm.yyyy) in der Tabelle steht, müsste ich das irgendwie umrechnen... leider hab ich kein plan wie!

Mein versuch schaut wie folgt aus:

PHP:
$connectionid = mysql_connect ("host", "user", "pass");
if (!mysql_select_db ("db012", $connectionid))
{
  die ("Keine Verbindung zur Datenbank");
}

$sql = "SELECT * FROM user WHERE name LIKE '".$_REQUEST["name"]."' AND plz LIKE '".$_REQUEST["plz"]."'";
}
$result = mysql_query ($sql);

if (mysql_num_rows ($result) > 0)
{
	$data = mysql_fetch_array($result); 
	
	$gebdat = $data["geburt"];
			$geb=explode(".",$gebdat);
			$nowdat = date('d.m.Y');
			$now = explode('.', $nowdat);
			$alter = $now[2]-$geb[2];
			if ("$now[1]$now[0]"<"$geb[1][$geb[0]") $alter--;

So, dass Alter hab ich schonmal rausbekommen! theoretisch müsste ich jetzt irgendwie das array filten... ich weiß nur nicht wie?! Ich hoffe, Ihr könnt mir da ein bisschen helfen.
 
Ich bin mir nicht sicher aber ich glaube nicht dass du im Format dd.mm.yyyy so einfach zwei Daten vergleichen kannst. Du würdest es dir viel einfacher machen wenn du das Geb. Datum in der Datenbank als Timestamp speicherst.
 
@danube:
Wenn du das ganze mit Timestamp machst, bekommst du aber Probleme mit dem Jahr 1970 ... so wie wir das kennen.

Ich habe mir mal überlegt ob man sowas nicht auch direkt im SQL regeln könnte. Hab in einem alten Script von mir folgende SQL-Anweisung gefunden:
Code:
SELECT
  (YEAR (CURRENT_DATE) -YEAR(Datum)) -
  RIGHT (CURRENT_DATE,5) < RIGHT (Datum,5)) AS age
FROM
  Tabelle

Wenn du jetzt eine Tabelle mit der Spalte "Datum" hast, die das Geburtsdatum enthält, gibt dir diese Funktion das Alter zurück. Jetzt könnte man diese Funktion einfach in den WHERE-Teil setzen und mit Werten vergleichen.

Code:
SELECT * FROM user WHERE
  (YEAR (CURRENT_DATE) -
   YEAR (Geburt)) -
   RIGHT (CURRENT_DATE,5) < RIGHT (Geburt,5)) between 14 and 20

Diese Funktion müsste eigentlich alle Datensätze filtern, wo das Alter zwischen 14 und 20 ist. Hab es allerdings nicht ausprobiert. Also keine Gewähr auf Funktionalität.
 
also ich hab das mal ausprobiert, aber ich bekomm immer wieder einen fehler! der muss irgendwo in der sql abfrage sein. ich poste mal meinen code:

PHP:
<?php include ("checkuser.php"); 

$connectionid = mysql_connect ("host", "user", "pass");
if (!mysql_select_db ("db1202", $connectionid))
{
  die ("Keine Verbindung zur Datenbank");
}
if ($_REQUEST["bild"] == true) {
	$sql = "SELECT * FROM userinfo WHERE geschlecht LIKE '".$_REQUEST["geschlecht"]."' AND plz LIKE '".$_REQUEST["plz"]."' AND bildpfad NOT 'usrpics/nopic.gif' AND (YEAR (CURRENT_DATE) - YEAR (geburt)) - RIGHT (CURRENT_DATE,5) < RIGHT (geburt,5)) between '".$_REQUEST["altermin"]."' and '".$_REQUEST["altermax"]."' ORDER BY nickname DESC";
}
else {
	$sql = "SELECT * FROM userinfo WHERE geschlecht LIKE '".$_REQUEST["geschlecht"]."' AND plz LIKE '".$_REQUEST["plz"]."' AND (YEAR (CURRENT_DATE) - YEAR (geburt)) - RIGHT (CURRENT_DATE,5) < RIGHT (geburt,5)) between '".$_REQUEST["altermin"]."' and '".$_REQUEST["altermax"]."' ORDER BY nickname DESC";
}
$result = mysql_query ($sql);

if (mysql_num_rows ($result) > 0)
{
	$data = mysql_fetch_array($result);
	?>
.
.
.
hier geht die html ausgabe weiter
.
.
.
 
Mhh also ich weiß ja jetzt nicht was du für einen Fehler bekommst, aber versuche mal in der SQL-Anweisung die Leerzeichen nach YEAR und RIGHT rauszunehmen, sodass zwischen YEAR und ( kein Leerzeichen ist. Der hat sich manchmal etwas komisch ... und bei der BETWEEN Anweisung kannst du es auch mal ohne die Hochkommas probieren. Hab jetzt leider keine Zeit mir das genauer anzugucken. Probier einfach mal. Ich schau heute Abend bestimmt nochmal rein.
 
Zurück