Datum absteigend sortieren / Ignorieren von Leerfeldern

In diesem Forum können Mod-Autoren ihre Mods vorstellen, die sich noch im Entwicklungsstatus befinden. Der Einbau in Foren im produktiven Betrieb wird nicht empfohlen.
Forumsregeln
phpBB 2.0 hat das Ende seiner Lebenszeit überschritten
phpBB 2.0 wird nicht mehr aktiv unterstützt. Insbesondere werden - auch bei Sicherheitslücken - keine Patches mehr bereitgestellt. Der Einsatz von phpBB 2.0 erfolgt daher auf eigene Gefahr. Wir empfehlen einen Umstieg auf phpBB 3.0, welches aktiv weiterentwickelt wird und für welches regelmäßig Updates zur Verfügung gestellt werden.
Benutzeravatar
Akschel
Mitglied
Beiträge: 43
Registriert: 14.12.2006 17:10
Wohnort: Stuttgart
Kontaktdaten:

Datum absteigend sortieren / Ignorieren von Leerfeldern

Beitrag von Akschel »

Hallo,

ich habe folgende Frage:
In meinem Forum ( http://axel.perschmann.info ) habe ich eine Geburtstagsfunktion hinzugemoddet. In der Mitgliederliste besteht nun die Möglichkeit die Mitglieder nach Geburtsdatum zu sortieren.
Wenn ich Aufsteigend sortiere ist das alles kein Problem, nun hätt ich aber gern beim Absteigend sortieren, dass die Nutzer ohne Gebursdatum (Deren Datenbank-Geburtsdatumswert (user_birthday) wird per Mod auf '999999' festgelegt) ignoriert werden und erst nach Usern mit Datum angezeigt werden.

So sieht es immoment aus:
-Kein Geburtsdatum
-10.10.2000
-10.10.1900

Und so möcht ich es haben:
-10.10.2000
-10.10.1900
-Kein Geburtsdatum

So sieht der entsprechende Sortierbefehl im Code aus

Code: Alles auswählen

	case 'birthday':
		$order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
Es steht deutlich sichtbar noch nichts davon da, dass er User ohne Geburtsdatum ignorieren und erst an den Schluss stellen soll. Wie gebe ich diesen entsprechenden Befehl? Ich vermute mal es ist am einfachsten ihm zu sagen, er soll erst die User mit Geburstagsdatenbankwert ungleich 999999 (Also kein Geburtsdatum) sortieren und danach die Restlichen User mit Wert 999999 auflisten.

Da ich aber nicht so der php-Profi bin, wäre es recht net, wenn mir das jemand schreiben könnte :)
Benutzeravatar
bgx
Mitglied
Beiträge: 228
Registriert: 30.11.2005 22:32
Kontaktdaten:

Beitrag von bgx »

Du müsstest bei der SQL abfrage folgendes dabeischreiben:

Code: Alles auswählen

WHERE user_birthday <> 999999
Dann sollte es klappen!
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Aber dann fehlen die Benutzer ohne eingegebenen Geburtstag.

Ich würde das ganze per PHP lösen: Zwei Arrays anlegen, das erste mit den Benutzern mit Geburtstag und das zweite mit den Benutzern ohne Geburtstag füllen. Dann die beiden Arrays in der richtigen Reihenfolge kombinieren (array_merge()) und ausgeben.
Eine Alternative wäre auch, das ganze mit 2 separaten Queries zu lösen.
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Man kann auch erst alle mit WHERE <> und dann noch mal mit = ausgeben.

OT: @ Akschel, ne ziemlich breite Zielgruppe hast Du da. :lol:
Benutzeravatar
Akschel
Mitglied
Beiträge: 43
Registriert: 14.12.2006 17:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von Akschel »

S2B hat geschrieben:Aber dann fehlen die Benutzer ohne eingegebenen Geburtstag.

Ich würde das ganze per PHP lösen: Zwei Arrays anlegen, das erste mit den Benutzern mit Geburtstag und das zweite mit den Benutzern ohne Geburtstag füllen. Dann die beiden Arrays in der richtigen Reihenfolge kombinieren (array_merge()) und ausgeben.
Eine Alternative wäre auch, das ganze mit 2 separaten Queries zu lösen.
Xwitz hat geschrieben:Man kann auch erst alle mit WHERE <> und dann noch mal mit = ausgeben.
Wie genau schreib ich das dann in den Code? Bin noch nicht so großartig Bewandert mit php.

So im groben Zusammengefasst:
Gesamtliste = User <> 999999 + danach User = 999999
Könnt mir da jemand den fertigen Code dazu sagen?
so vielleicht?

Code: Alles auswählen

case 'birthday':
      WHERE user_birthday <> 999999
      {
      $order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
      break;
      }
      AND WHERE user_birthday = 999999
      {
      $order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
      break;
      }

Xwitz hat geschrieben:OT: @ Akschel, ne ziemlich breite Zielgruppe hast Du da. :lol:
Meinst vom Alter der User her? ;)
Najo dürfte daran liegen, dass der Testuser 83 is :D :D
Aber wenn mal langsam alle angemeldet sind geht die Spanne trotzdem von 15 bis 55 :o
Zuletzt geändert von Akschel am 20.12.2006 16:50, insgesamt 1-mal geändert.
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Also WHERE ist schon mal ein SQL-Befehl den man mit php übergibt, den php aber selber nicht kennt (nehme ich an 8) ).

Das $order_by = "..." sieht aber schon mal nach SQL aus, also sollte es vermutlich auch da rein. (An der Sortierung habe ich noch nie was gemacht.)


Öhm, ich sehe gerade, daß mit den zwei Abfragen ist nicht so einfach einzubauen, weil in dem case nur der String zusammengebaut wird. Der zweite Durchlauf müßte irgendwie zusätzlich rein.

Dann besser in einem Rutsch. Einfach mal abwarten, was hier rauskommt: http://www.phpbb.de/viewtopic.php?t=138172 (Edit: mein Fehler, daß würde hier nicht helfen) Ich melde mich wieder.

Edit 2:

Erst mal zurück zum alten order_by, also:

Code: Alles auswählen

	case 'birthday':
		$order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
weiterhin suche:

Code: Alles auswählen

$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . "
	ORDER BY $order_by";
ersetze mit:

Code: Alles auswählen

if ($mode == 'birthday')
{
$sql = "(SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . " AND user_birthday <> 999999 
	ORDER BY $order_by) UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . " AND user_birthday = 999999 
	ORDER BY $order_by) LIMIT $start, " . $board_config['topics_per_page'];
}
else
{
$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar 
	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . "
	ORDER BY $order_by";
}
Der else-Teil ist das Original und bei birthday gibt es die Sonderbehandlung. Ich hoffe es funktioniert, getestet habe ich es nicht.

edit 3 (14:28Uhr): Code korrigiert, LIMIT "über alles" hinzugefügt.
Benutzeravatar
Akschel
Mitglied
Beiträge: 43
Registriert: 14.12.2006 17:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von Akschel »

Hab nen kleinen Fehler noch bei dir gefunden
Und zwar steh bei dir in deiner

Code: Alles auswählen

$sql = "(SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
kein user_birthday drin. Bei mir heißt es nun

Code: Alles auswählen

$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
Dann kommt aber folgende Fehlermeldung :o
Could not query users

DEBUG MODE

SQL Error : 1064 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 ') UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, use' at line 5

SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar FROM phpbb_users WHERE user_id <> -1 AND user_birthday <> 999999 ORDER BY user_birthday ASC LIMIT 0, 50) UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar FROM phpbb_users WHERE user_id <> -1 AND user_birthday = 999999 ORDER BY user_birthday ASC LIMIT 0, 50) LIMIT 0, 50

Line : 169
File : memberlist.php
:-?

Insgesamt sieht das so aus:

Code: Alles auswählen

	case 'birthday':
		$order_by = "user_birthday $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
	default:
		$order_by = "user_regdate $sort_order LIMIT $start, " . $board_config['topics_per_page'];
		break;
}

if ($mode == 'birthday')
{
$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar

	FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . " AND user_birthday <> 999999
	ORDER BY $order_by) UNION (SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
	FROM " . USERS_TABLE . "
	   WHERE user_id <> " . ANONYMOUS . " AND user_birthday = 999999
   ORDER BY $order_by) LIMIT $start, " . $board_config['topics_per_page'];
}
else
{
$sql = "SELECT username, user_id, user_viewemail, user_posts, user_regdate, user_birthday, user_from, user_website, user_email, user_icq, user_aim, user_yim, user_msnm, user_avatar, user_avatar_type, user_allowavatar
    FROM " . USERS_TABLE . "
	WHERE user_id <> " . ANONYMOUS . "
	ORDER BY $order_by";
	}
Xwitz
Mitglied
Beiträge: 1104
Registriert: 21.06.2005 21:41

Beitrag von Xwitz »

Das user_birthday, war in meiner memberlist.php nicht drin, daher. :oops:

Zum Fehler, im wahren Pfad von if fehlt die öffnende Klammer vor dem SELECT (in meinem Code-Schnipsel ist sie drin).
Benutzeravatar
Akschel
Mitglied
Beiträge: 43
Registriert: 14.12.2006 17:10
Wohnort: Stuttgart
Kontaktdaten:

Beitrag von Akschel »

[ externes Bild ]

Ich Idiot :-? Danke dir nun tuts einwandfrei :-D

Wenn ich das gleiche noch mit diversen anderen Feldern wie Beispielsweise das Website Feld machen möchte schreib ich einfach so:

Code: Alles auswählen

if ($mode == 'birthday')  .....
if ($mode == 'website') .....
else .....
oder?
Benutzeravatar
S2B
Ehemaliges Teammitglied
Beiträge: 3258
Registriert: 10.08.2004 22:48
Wohnort: Aachen
Kontaktdaten:

Beitrag von S2B »

Code: Alles auswählen

if ($mode == 'birthday')  .....
else if ($mode == 'website') .....
else .....
:wink:
Gruß, S2B
Keinen Support per ICQ/PM!
Hier kann man meine PHP-Skripte und meine MODs für phpBB runterladen.
Antworten

Zurück zu „phpBB 2.0: Mods in Entwicklung“