Suche Alter "von - bis"

DeeJay-Luke

Mitglied
Morgen, kein plan ob das nur ein Denkfehler ist oder was anderes.
Ich habe das wbb Forum etwas erweitert, die Alters Suche "von - bis":

Das Alter des Users wird in MySql Feldtyp "date" in die Datenbank gespeichert z.B. "1982-12-31", und folgendes Script habe ich geschrieben, dass die User von z.B. 17 Jahren bis 29 Jahren suchen können, aber es wird nur bis 28 Jahren angezeigt.

Hier das Online Demo

So sieht das Code aus:

PHP:
	$alter_min		= $_POST["alter_min"];
	$alter_max		= $_POST["alter_max"];
	
	//ALTER UMRECHNEN

	$alter_min_unix = intval(time("")-$alter_min * (365*24*3600));
	$alter_von 		= date("Y-m-d", $alter_min_unix);

	$alter_max_unix = intval(time("")-$alter_max * (365*24*3600));
	$alter_bis 		= date("Y-m-d", $alter_max_unix);

	if($_POST["mitBild"] == "1") {
		$mitBild = "AND avatarid > 0";
	}


$query = "SELECT * FROM bb1_users WHERE $mitGender $mitBild AND birthday < '$alter_von' AND birthday > '$alter_bis' ORDER BY birthday";
 
PHP:
AND birthday < '$alter_von' AND birthday > '$alter_bis'
Logisch, dass er nur bis 28 anzeigt. 17 sollte er auch nicht anzeigen. Die Bedingung ist ja "kleiner als" oder "größer als".

Vorschlag:
PHP:
AND birthday <= '$alter_von' AND birthday >= '$alter_bis'
 
Hallo!

Schon mal daran gedacht dass Du bei Deiner Berechnung keine Schaltjahre berücksichtigt hast?

Gruss Dr Dau
 
Wird das Datum in der mySQL-Datenbank mit führenden Nullen gespeichert?
Also Juli als "07" statt "7"?

date("Y-m-d",time());
speichert das heutige Datum als "2006-07-31". Steht das Datum aber als "2006-7-31" in der Datenbank passt die Abfrage nicht mehr, weil
"2006-07-31" < "2006-7-31"
 
Dass spielt (wenn überhaupt) nur eine untergeordnete Rolle.
Er errechnet seinen Timestamp mit 365 Tagen im Jahr..... Schaltjahre haben aber 366 Tage.
Somit MUSS es zu fehlerhaften Ergebnissen führen.
Dass er den Timestamp selber berechnet, lässt mich vermuten dass er das Script unter Windows laufen lässt..... denn dort sind negative Timestamps nicht möglich.
 
Unter Windows?
Da wüsste ich jetzt nicht wie man es lösen könnte..... unter Windows sind ja negative Timestamps (also alles vor dem 01.01.1970) nicht möglich.
Hier kommt bei einer Berechung noch erschwerend hinzu dass nicht alle 4 Jahre ein Schaltjahr ist..... von der Schaltsekunde mal abgesehen.

Unter UNIX/Linux würde ich es ungefähr so machen:
PHP:
if(isset($_POST['min_alter']) AND isset($_POST['max_alter'])) {
    if($_POST['min_alter'] <= $_POST['max_alter']) {
        if($_POST['min_alter'] == $_POST['max_alter']) {
            $max_alter = $_POST['max_alter']+1;
        } else {
            $max_alter = $_POST['max_alter'];
        }
 
        $min = date("Y-m-d", strtotime("-".$_POST['min_alter']." years"));
        $max = date("Y-m-d", strtotime("-".$max_alter." years +1 day"));
 
        $result = mysql_query("SELECT * FROM `geburtstage` WHERE `geburtsdatum` BETWEEN DATE_FORMAT('".mysql_real_escape_string($max)."', '%Y-%m-%d') AND DATE_FORMAT('".mysql_real_escape_string($min)."', '%Y-%m-%d')");
 
        while($row = mysql_fetch_array($result)) {
            echo $row['name']." ist am ".$row['geburtsdatum']." geboren.<br>\r\n";
        }
    } else {
        echo "Das Mindestalter kann nicht höher sein als das Höchstalter!\r\n";
    }
}
Nun noch das Alter berechnen.
Dazu würde ich das Geburtsjahr vom aktuellen Jahr abziehen..... schon hast Du die Differenz in Jahren
Dann noch prüfen ob der Geburtsmonat und Geburtstag schon gewesen sind, wenn nicht dann ziehst Du von der zuvor errechneten Differenz 1 ab.
Gut möglich dass man es auch im SELECT mit einbauen kann..... ich denke es würde dann aber nur über ein Subselect funktionieren, da kann ich Dir aber auch nichts zu sagen.
 
Zurück