(Else)if Abfrage funktioniert nicht

Hi,

ich möchte mithilfe einer if-bedingung abfragen, welche Schulklassen nach dem Anklicken der jeweiligen Schulform angezeigt werden sollen. Genauer erklärt: Klickt z.B. jemand auf den Button „Grundschule“ so wird er zur nächsten Seite weitergeleitet wo dann nur die Klassen 1-4 angezeigt werden. Zuerst hatte ich dafür nur if-Bedingungen benutzt (ohne else oder elseif) aber das hat nicht funktioniert. Die Sessions werden korrekt abgespeichert und abgerufen (also wenn ich die Session ausgeben lasse, ist auch jedes Mal „grundschule“, „hauptschule“ etc. drin). Nach elseif hat es dann etwas besser funktioniert aber es klappt nur für die erste und zweite if-Bedingung → Grundschule funktioniert einwandfrei (zeigt 1. - 4. Klasse an), der zweite Fall für Förder- und Hauptschule auch (zeigt 5. - 9. Klasse an) aber danach wird egal ob Realschule angeklickt wird oder Gymnasium weiterhin immer nur noch 5. - 9. Klasse angezeigt anstatt 5.-10. oder 5.-13.

Hier der Code ab den if-Bedingungen (der Teil zwischen PHP sind die HTML Buttons für die angezeigten Klassen):

[php]<?php if (@$_SESSION['schule'] == "grundschule" ) { ?>

1. Klasse

2. Klasse

etc. bis 4. Klasse <?php } elseif (@$_SESSION['schule'] == "foerderschule" OR "hauptschule" ) { ?>

5. Klasse

6. Klasse

etc. bis 9. Klasse <?php } elseif (@$_SESSION['schule'] == "realschule" ) { ?>

5. Klasse

6. Klasse

etc. bis 10. Klasse <?php } else { ?>

5. Klasse

6. Klasse

etc. bis 13. Klasse <?php } ?>

[/php]

Weiß jemand wo das Problem liegen könnte?

Herzliche Grüße,
Frank

Wenn Du mit Formularen arbeitest für die Auswahl wäre $_POST sicherlich richtiger als $_SESSION. Zudem wäre es gut, wenn Du das @-Zeichen weglässt, da du damit (zumindest bei älteren PHP-Versionen) auftretende Fehler unterdrückst die dich ggfs. bei deiner Suche weiterbringen würden.

Wie threadi schon sagte nehme das @ Zeichen weg und bei der zweiten Bedingung musst du auch sagen
$_session[Schule] == ‚hauptschule‘

Mir ist nun nicht bekannt das man da nur die Werte rein schreiben kann, aber ich könnte mich auch irren

[PHP]
Grundschule
Realschule
Grundschule
Absenden

<?php if(isset($_POST['school']) AND empty($_POST['school']) === FALSE) { switch($_POST['school']) { case 'grundschule': echo "Du Grundschüler!"; break; case 'realschule': echo "Du Realschüler!"; break; default: echo "Du kackst wahrscheinlich noch in die windeln!"; break; } } ?>[/PHP]

Hallo zusammen,

danke für die Antworten! Ich glaube, ich hatte mich bei der Problemstellung etwas undeutlich ausgedrückt.
Das sind insgesamt vier Seiten, die hintereinander verlinkt werden.
Auf den ersten drei Seiten wird anhand von Textfeldern abgefragt, welche Schule, Fach und Klasse derjenige auswählen möchte und auf der Letzten wird demjenigen dann eine bestimmte Menge von Lehrerprofilen angezeigt, die zu seiner Auswahl passen (ist für eine kleine Nachhilfevermittlung). Auf der ersten Seite wählt er die Schulform, klickt er nun z.B. auf Grundschule, wird er a) auf die nächste Seite geleitet und b) wird an diese Seite gesendet, dass er eben auf grundschule geklick hat, um das über GET in eine Session abzuspeichern.

Also auf erste Seite kann man anklicken welche Schule man wählt:

[html]

Grundschule

[/html] etc.

Dies wird auf der folgenden Seite dann in die Session abgespeichert:

[php]
if ($_GET[‚schule‘] <> „“)
{
$_SESSION[‚schule‘] = $_GET[‚schule‘];
}
[/php]

Auf dieser Seite wird nun weiter abgefragt, wieder über Textfelder, welches Fach er denn wählen möchte:

[html]


Deutsch

[/html]
etc.

Das wird auf der darauffolgenden Seite auch wieder in eine Session abgespeichert, genau wie oben. Und das funktioniert alles wunderbar (auch die Sessions) bis zur dritten Seite mit den Klassen, wo nun eben nur die Klassen angezeigt werden sollen (über if bzw. elseif Abfragen), die zur jeweiligen Schulform, die am Anfang gewählt wurde, passen. Da wird nun nur bei if schule = grundschule korrekt die ersten vier Klassen ausgegeben und über elseif die Klassen 5-9 für Förder- oder Hauptschule, aber sonst funktioniert da nichts, die Klassen 5-9 werden auch für Gymnasium, Gesamtschule, Berufsschule etc. ausgegeben obwohl es die identische elseif Abfrage ist!
Also im Code steht ja … elseif (schule = realschule) { → klassen 5-10), aber trotzdem, nur 5-9.
Fehler kommen keine und die Session gibt bei echo session xx auch jeweils die richtig abgespeicherte variable wieder (grundschule, realschule, gesamtschule etc.)

Darf man vielleicht nur einmal elseif benutzen? Aber das würde keinen Sinn machen oder?
Zumindest wäre es dann logisch warum nur if… elseif… funktioniert und nicht das folgende elseif…

Sorry für den langen Text :frowning:

Wie schon erwähnt

[PHP]
elseif ($_SESSION[‚schule‘] == „foerderschule“ OR $_SESSION[‚schule‘] == „hauptschule“ ) {
[/PHP]

du hast folgendes stehen
[PHP]
elseif ($_SESSION[‚schule‘] == „foerderschule“ OR „hauptschule“ ) {
[/PHP]

Oha es klappt! Ich hätte niemals gedacht, dass das Fehler war! Danke dir!

Hab vor allem nicht verstanden, warum das dann die nachfolgenden elseif-Bedingungen lahm legt und nicht die, die es bedingt (also Förder- und Hauptschule).

Aber jetzt funktioniert’s, also besten Dank noch mal!

Trotzdem ist es ratsam soetwas nicht per SESSION, sondern wenn man ein Formular benutzt per POST oder GET zu verarbeiten.

Es reicht
[PHP]if (!empty($_POST[‚school‘])) {[/PHP]
Aus der Doku zu empty

Eine Variable ist leer, wenn sie nicht existiert oder wenn ihr Wert gleich FALSE ist.

So wie ich ihn verstanden habe, dann hat er mehrere Formulare, also ist das mit Session doch ok?
Die zwei einzigen Möglichkeiten die ich noch kenne wäre ein Formular, aber mit Javascript Formular steps einbauen, oder er setzt bei den nächsten Formulare ein input hidden mit den Werten aus dem vorigem Formular.

Eins ist mir noch eingefallen, er könnte die GET Parameter auch immer erweitern.

Oder versteh ich es nun falsch?

Ich versuche es mal zu erklären, bin da nicht wirklich gut drin, aber dein
OR „hauptschule“
war für die if bedingung immer true. Und der Rest ist halt nur Logik. Sprich wenn (ich kürz es etwas ab)
Schule == grundschule war geht er in die erste if und aufgrund der elseif nicht mehr weiter. Wenn Schule == foerderschule war lief auch noch alles, weil es vor der Bedingung OR „hauptschule“ stand. Denn wenn die erste Bedingung zutrifft, prüft er alle anderen Bedingungen nicht mehr, was auch logisch sein sollte bei einem OR bei AND ist es natürlich was anderes.

Da nun aber „hauptschule“ nun immer als true erkannt wurde, ging er halt nicht mehr weiter in die nächste elseif. Ich hoffe das ist etwas verständlich, ansonsten nookie, erklär du es mal :stuck_out_tongue:

EDIT: Noch ein Ratschlag, Formulare würde ich immer mit POST abschicken, bzw. ich persönlich hab es mir so angeeignet. Wenn ich was mit GET abschicke dann will ich es auch irgendwie speichern können als bookmark zum Beispiel, wie ne Suche oder ein Filter.

Ich weiß das es reicht, allerdings empfinde ich dies als die bessere und schönere Variante, vorallem wenn noch jemand anders über deinen Quellcode schaut. Jenkins rät auch dazu („=== FALSE“), allerdings nur wenn du es auch so konfiguriert hast.

Ich benutze auch stets POST anstatt GET bei Formularen, allerdings ist dies kein Formular. Die jeweiligen Infos werden nur im Link weitergesendet, oder geht das dort auch per POST?
Also z.B. →
[html]<ahref=„lehrerwaehlen-klasse.php?schule=hauptschule“>[/html]

Auf der nächsten Seite fange ich das „schule=hauptschule“ über GET dann auf und packe es in die Session:

[html]
if ($_GET[‚schule‘] <> „“)
{
$_SESSION[‚schule‘] = $_GET[‚schule‘];
}
[/html]

Am Ende habe ich dann drei Sessions (für Klasse, Fach und Schule) und sortiere mithilfe der If- bzw. elseif-Bedingungen dann die Profile.

Grüße!