Alter + 1 wenn User geburtstag hat

Da die diese Art von Fragen sehr oft kommt, habe ich mal ein Tutorial geschrieben wie man am besten auf Fehlersuche geht.
PHP MySQL Debug Queries
Geh es doch mal durch und falls du die Lösung nicht findest, poste mal das ausgegebe SQL-Statement ins Forum.

Willst du nicht ein Leerzeichen vor das WHERE setzen?
 
Hui,

schau dir mal diese Zeile genau an:

PHP:
$wheres[] = "({$userAlterSqlCalulation} BETWEEN {$_GET['Alter_von']}AND {$_GET['Alter_bis']}) OR `birthday` IS NULL";;

Insbesondere das (nicht vorhandene) Space vor dem AND.
 
Danke es hat geklappt doch leider kann ich die User aufeinmal nicht mehr filtern weder nach geschlecht oder nickname usw. es werden lediglich alle User angezeigt.

PHP:
  // 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']}'";
if($_GET['Alter_von']) $wheres[] = "age between '{$_GET['Alter_von']}'AND '{$_GET['Alter_bis']}'";
if($_GET['Alter_bis']) $wheres[] = "age 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 *, {$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} 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;
    }


Ich habe mal die query ausgeben lassen und habe folgende Meldung bekommen:

PHP:
SELECT *, TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE()) AS `user_alter` FROM `ws_b9L_user`WHERE (TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE()) BETWEEN 14 AND 100) OR `birthday` IS NULL AND age between '14'AND '100' AND age between '14'AND '100' ORDER BY nickname ASC LIMIT 0,45

Aber kann nichts damit anfangen :S


Danke für jede Antwort.

p.s. Sorry das ich so schwer bin :S
 
Zuletzt bearbeitet:
item: Formatier dein Code! Tabulatoren machen das DIng lesbar. Ich weigere mich das zu lesen, weil ich es zuerst formatieren müsste um zu sehen welcher if() wo endet.

item: Was fällt hier auf?
SQL:
FROM `ws_b9L_user`WHERE
--und 2 mal 
age between '14'AND '100'

item: Du hast unsere oberen Punkte nicht umgesetzt. Dir fehlen immer noch Leerzeichen
item: Formatier mal dein SQL, dann siehst du auch was da genau gefiltert wird

SQL:
SELECT 
	*, 
	TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE()) AS `user_alter` 
FROM 
	`ws_b9L_user` --Hier fehlt bei dir ein Leerzeichen --
WHERE 
	(TIMESTAMPDIFF(YEAR, `birthday`, SYSDATE()) BETWEEN 14 AND 100) 
	OR `birthday` IS NULL 
	AND age BETWEEN '14' --Hier fehlt bei dir ein Leerzeichen --
		AND '100' 
	AND age BETWEEN '14' --Hier fehlt bei dir ein Leerzeichen --
		 AND '100' 
ORDER BY 
	nickname ASC 
LIMIT 0,45
item: Du hast 2 mal denselben Between
item: Warum berechnest du das alter, wenn du es bereits im Feld age hast? Das ergibt 3 mal die Abfrage auf das alter. Einmal reicht

Wie weiter oben geschrieben, weiss ich nicht was du da in deinem nicht lesbaren PHP-Code zusammenbrösmelst. Aber es wundert mich nicht, dass du so keine Fehler findest.
 
Zuletzt bearbeitet von einem Moderator:
Danke Yaslaw ich habe das Problem gelöst. Das Problem lag bei OR `birthday` IS NULL ich habe dies wegenommen ich hoffe das dies keine Auswirkungen hat wenn ja dann bitte bescheid sagen. Die Tabelle age war noch vom frühreren Versuch da und habe vergessen sie auszulassen.

gruß

skype20
 
PHP:
if($_GET['Alter_von']) $wheres[] = "age between '{$_GET['Alter_von']}'AND '{$_GET['Alter_bis']}'";
if($_GET['Alter_bis']) $wheres[] = "age between '{$_GET['Alter_von']}'AND '{$_GET['Alter_bis']}'";
Schön, doch wenn du nur das Alter_bis ausfüllst, dann gibt das between ein Fehler.
In Post 15 dieses Threads habe ich dir bereits einmal alles vorprogrammiert.

PHP:
	// Wenn beide angegeben sind: BETWEEN
	if(isset($_GET['Alter_von']) && isset($_GET['Alter_bis'])){
			$wheres[] = "({$userAlterSqlCalulation} BETWEEN {$_GET['Alter_von']} AND {$_GET['Alter_bis']})";;
	// Wenn nur Alter_von angegeben ist: grössergleich
	}elseif(isset($_GET['Alter_von'])){
			$wheres[] = "({$userAlterSqlCalulation} >={$_GET['Alter_von']})";;		
	// Wenn nur Alter_bis angegeben ist: kleinergleich
	}elseif(isset(isset($_GET['Alter_bis']))){
			$wheres[] = "({$userAlterSqlCalulation} <= {$_GET['Alter_bis']})";;		
	}
 
Hmm ok aber da das Alter_von und das Alter_bis sind immer ausgefüllt , dann müsste das doch kein Problem sein. Sprich Alter_von und das Alter_bis können nie leer stehen weil ich bei den select boxen den Startwert von Alter_von auf 14 gesetzt habe und den Startwert bei Alter_bis auf 100 gesetzt habe(Bitte korriegieren wenn das nicht möglich ist!). Dennoch habe ich noch ne frage kann ich bei jedem neuen User das Geburtsdatum so setzten das er zumindest 14 oder 100 Jahre ist denn der User wird nicht gefunden wenn er sich neu anmeldet und wenn er sein Geburtsdatum nicht angegeben hat kriegt er somit das Alter 0 und wird nicht gefunden da mein Suchfilter ab Alter 14 User sucht.
 
Warum prüfst du die Alter_von und Alter_bis, wenn sie sowieso abgefüllt sind? Unnätig. Da reicht die Zeile wo der Between hergestellt wird ohne den if() aus.

Ja, kannst du. ABer erst Sinnvoll, wenn du dein bisheriges WHERE bereinigt hast. Das 3 mal das gleiche im WHERE steht ist nicht gerade praktisch wenn du noch ORs dazu haben willst. Dann geht nämlich auch das OR, welches du wieder rausgelöscht hast.
 
Ok habe es mal so gemacht wie ich das verstanden habe ich hoffe es ist soweit richtig

PHP:
   $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($_GET['Alter_von'] && $_GET['Alter_bis']){
            $wheres[] = "({$userAlterSqlCalulation} BETWEEN {$_GET['Alter_von']} AND {$_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

Aber es ****t leider nicht -..- da ich das or birthday hinzugefügt habe.
 
Zurück