Alter + 1 wenn User geburtstag hat

Jepp. Das Alter jedesmal berechnen und nicht eintragen... Aber das hatten wir ja schon.
Warum soll jemand das Alter 100 bekommen? Ich versteh irgendwie den Geasammtablauf nicht
 
Wo ist denn das Problem wenn er als Alter 0 einsetzt? Das sich jemand mit dem Alter "0 Jahre" bei deiner Seite anmeldet ist denke ich um einiges unwahrscheinlicher als einer der 100 ist. Was ist wenn der Nutzer gar nicht möchte dass sein Geburtstadum angezeigt wird? Ich verstehe auch das Problem nicht.
 
Ich brauche das Alter des Users in der Tabelle damit ich im Datenfilter die User nach dem Alter filtern kann. Im momment sieht der Abschnitt so aus:

PHP:
$wheres = array();
        //Jedes Feld prüfen und ggf in den Where-Array einfügen
........
........
........

        if($_GET['Alter_von']) $wheres[] = "alter between '{$_GET['Alter_von']}'AND '{$_GET['Alter_bis']}'";
        if($_GET['Alter_bis']) $wheres[] = "alter  between '{$_GET['Alter_von']}'AND '{$_GET['Alter_bis']}'";


        // WHERE-Tel des SQL-String zusammenstellen
        if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
        //SQL-String zusammensetzen
        $sql = mysql_query("SELECT * FROM `".PREFIX."user`{$wherestring}");
        //TODO: Sql an die DB absetzen

Wenn aber das Alter nicht seperat in der Tabelle steht, wird es doch um zu komplizierter die User nach dem Alter zu filtern. Deshalb wollte ich einfach das Alter in die spalte alter speichern.Und jetzt zu der Frage warum das Alter 100. Man kann auf meiner Seite nur User von 14-100 filtern. Und wenn sich ein User neu anmeldet steht in der Tabelle Alter null dirn somit wird er nicht gefunden bis er sein Alter bzw. Geburtstag eingetragen hat.Deshalb soll jeder User vorerst das Alter 100 zugewiesen bekommen.
 
Nur als Einwurf: Was ist, wenn der Nutzer gar nicht über die Alterssuche gefunden werden möchte?
Du könntest ihn sein Geburtsdatum auch einfach bei der Registration eintragen lassen. Oder deinen Wert 100. Ich sehe dort das Problem noch nicht.
 
Aua!
item: Was macht dein Script wenn nur ein alter_von eingetragen ist? Richtig, ein Fehler
item: Dito für alter_bis.
item: Und es wird für dich definitiv nicht einfacher wenn du das alter speicherst und zuerst bei jedem Zugriff aktualisieren musst oder gar ein Cronjob einrichten musst.
item: Zudem ist der Feldname alter gaaaaaanz blöde, weil das ein SQL-Befehl ist und auf ein Fehler führt, wenn du ihn nicht immer so `alter` schreibst.
item: Zudem ist alter eine Zahl, also behandle sie im SQL auch als Zahl und lass die '' weg! BETWEEN mit Strings verhält sich anderst als mit Zahlen. (String: '1111' ist kleiner wie '2' -- Zahl: 1111 ist grösser wie 2)

PHP:
	//SQL-Befhel um das Alter zu berechnen einmal definieren
	$userAlterSqlCalulation = 'TIMESTAMPDIFF(YEAR, `geburtsdatum`, SYSDATE())';
	// Wenn beide angegeben sind: BETWEEN
	if(isset($_GET['Alter_von']) && isset($_GET['Alter_bis'])){
			$wheres[] = "({$userAlterSqlCalulation} BETWEEN {$_GET['Alter_von']}AND {$_GET['Alter_bis']}) OR `geburtsdatum` IS NULL";;
	// Wenn nur Alter_von angegeben ist: grössergleich
	}elseif(isset($_GET['Alter_von'])){
			$wheres[] = "({$userAlterSqlCalulation} >={$_GET['Alter_von']}) OR `geburtsdatum` IS NULL";;		
	// Wenn nur Alter_bis angegeben ist: kleinergleich
	}elseif(isset(isset($_GET['Alter_bis']))){
			$wheres[] = "({$userAlterSqlCalulation} <= {$_GET['Alter_bis']}) OR `geburtsdatum` IS NULL";;		
	}

    // WHERE-Tel des SQL-String zusammenstellen
    if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
    //SQL-String zusammensetzen
    $sql = mysql_query("SELECT *, {$userAlterSqlCalulation} AS `user_alter` FROM `".PREFIX."user`{$wherestring}");
 
Danke. Wie ich hier sehe hast du isset benutzt ich habe neben $_GET['Alter_von'] noch andere GET-Variablen müsste ich die auch mit isset erstmals prüfen ?

PHP:
        .........
        .........
        ..........
        if($_GET['sex']) $wheres[] = "sex='{$_GET['sex']}'";
        if($_GET['land']) $wheres[] = "land='{$_GET['land']}'";
        if($_GET['username']) $wheres[] = "nickname LIKE '%{$_GET['username']}%'";
        if($_GET['state']) $wheres[] = "state='{$_GET['state']}'";
        if($_GET['status']) $wheres[] = "status='{$_GET['status']}'";
 
währe sauberer.

Achja, wennd u das alter nicht immer mit der ganzen Berechnung abrufen willst, dann kannst du auch einfach eine View in MySQL erstellen, die deine user-Tabelle um das berechnete alter erweitert...
 
Ja echt das ist cool. Könntest du mir das vllt. erklären anhand eines Beispieles oder mir einen Link von einem Tutorial schicken ? Möchte ausprobieren wie es mit beiden Methoden funktioniert und dazu lernen.
 
Dieses Script (die Namen noch anpassen) mit phpMyAdmin ausführen und die View ist erstellt.
Nachher kannst du mit PHP auf diese View genau gleich zugreifen wie auf die Tabelle. Das Alter ist immer aktuelle berechnet ohne dass es in der Tabelle gespeichert ist.
SQL:
CREATE VIEW `vw_user` AS 
SELECT  
	*,  
	TIMESTAMPDIFF(YEAR, `geburtsdatum`, SYSDATE()) AS user_alter 
FROM  user ;
 
Zuletzt bearbeitet von einem Moderator:
Hallo Yaslaw ich habe mal deine 1. Varriante ausprobiert und erhalte folgede Fehlermeldung

PHP:
Query failed:
errorno=1064
error=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 '100) OR `birthday` IS NULL' at line 1
query=SELECT *, TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE()) AS `user_alter` FROM `ws_b9L_user`WHERE (TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE()) BETWEEN 14AND 100) OR `birthday` IS NULL

Hier ist mein Skript dazu, was könnte nicht stimmen ?

PHP:
    <?php


    $_language->read_module('registered_users');

    eval("\$title_registered_users = \"".gettemplate("title_registered_users")."\";");
    echo $title_registered_users;

    function clear($text) {
            $text=strip_tags($text);
            $text=str_replace ("javascript:", "", $text);
            $text=$text;

            return $text;
    }

    // Prüfen ob das Formular gesendet wurde

        // Array initializieren. Falls kein argument angegeben wurde,
        // dann ist die Argumentliste ein leeres Array
        $wheres = array();
        //Jedes Feld prüfen und ggf in den Where-Array einfügen

    //SQL-Befhel um das Alter zu berechnen einmal definieren
         $userAlterSqlCalulation = 'TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE())';
         // Wenn beide angegeben sind: BETWEEN
        if(isset($_GET['Alter_von']) && isset($_GET['Alter_bis'])){
        $wheres[] = "({$userAlterSqlCalulation} BETWEEN {$_GET['Alter_von']}AND {$_GET['Alter_bis']}) OR `birthday` IS NULL";;
        // Wenn nur Alter_von angegeben ist: grössergleich
        }elseif(isset($_GET['Alter_von'])){
        $wheres[] = "({$userAlterSqlCalulation} >={$_GET['Alter_von']}) OR `birthday` IS NULL";;
        // Wenn nur Alter_bis angegeben ist: kleinergleich
        }elseif(isset($_GET['Alter_bis'])){
        $wheres[] = "({$userAlterSqlCalulation} <= {$_GET['Alter_bis']}) OR `birthday` IS NULL";;
        }
        if($_GET['sex']) $wheres[] = "sex='{$_GET['sex']}'";
        if($_GET['land']) $wheres[] = "land='{$_GET['land']}'";
        if($_GET['username']) $wheres[] = "nickname LIKE '%{$_GET['username']}%'";
        if($_GET['state']) $wheres[] = "state='{$_GET['state']}'";
        if($_GET['status']) $wheres[] = "status='{$_GET['status']}'";

        // WHERE-Tel des SQL-String zusammenstellen
        if(count($wheres)>0) $wherestring = "WHERE ".implode(' AND ', $wheres);
        //SQL-String zusammensetzen
        $sql = mysql_query("SELECT *, {$userAlterSqlCalulation} AS `user_alter` FROM `".PREFIX."user`{$wherestring}");
        //TODO: Sql an die DB absetzen





     $sex = $_GET["sex"];
     $land = $_GET['land'];
     $nickname = $_GET['username'];
     $state = $_GET['state'];
     $status = $_GET['status'];
     $Alter_von = $_GET['Alter_von'];
     $Alter_bis = $_GET['Alter_bis'];

    // Anzahl der Mitglieder
    $user_count= safe_query("SELECT * FROM ".PREFIX."user ");
    $user_results= mysql_num_rows($user_count);
    // Anzahl der Mitglieder

    $maxusers =45;
    $alle = safe_query("SELECT *, {$userAlterSqlCalulation} AS `user_alter` FROM `".PREFIX."user`{$wherestring}");
    $gesamt = mysql_num_rows($alle);
    $pages = ceil($gesamt/$maxusers);

    if(isset($_GET['page'])) $page=(int)$_GET['page'];
    else $page = 1;
    $sort="nickname";
    if(isset($_GET['sort'])){
      if(($_GET['sort']=='country') || ($_GET['sort']=='nickname') || ($_GET['sort']=='lastlogin') || ($_GET['sort']=='registerdate')) $sort=$_GET['sort'];
    }

    $type="ASC";
    if(isset($_GET['type'])){
      if(($_GET['type']=='ASC') || ($_GET['type']=='DESC')) $type=$_GET['type'];
    }

    if($pages>1)  $page_link = makepagelink("index.php?site=registered_users&amp;sort=$sort&amp;type=$type&amp;sex=".$sex."&amp;land=".$land."&amp;username=".$nickname."&amp;state=".$state."&amp;status=".$status."&amp;Alter_von=".$Alter_von."&amp;Alter_bis=".$Alter_bis, $page, $pages);
    else $page_link='';

    if($page == "1") {
        $ergebnis = safe_query("SELECT *, {$userAlterSqlCalulation} AS `user_alter` FROM `".PREFIX."user`{$wherestring}s ORDER BY ".$sort." ".$type." LIMIT 0,".$maxusers);
        if($type=="DESC") $n=$gesam;
        else $n=1;
    }
    else {
        $start=$page*$maxusers-$maxusers;
        $ergebnis = safe_query("SELECT *, {$userAlterSqlCalulation} AS `user_alter` FROM `".PREFIX."user`{$wherestring} ORDER BY ".$sort." ".$type." LIMIT ".$start.",".$maxusers);
        if($type=="DESC") $n = ($gesamt)-$page*$maxusers+$maxusers;
        else $n = ($gesamt+1)-$page*$maxusers+$maxusers;
    }

grüße

skype20
 
Zurück