problem mit einer session
azok
- php
0 frankx0 azok
0 dedlfix0 azok
0 Problem mit Switch
Sven Rautenberg
hi!
ich scripte nun (noch immer) an meinem weblog... - nun, leider treten beim login ein paar probleme auf. sobald das password korrekt eingegeben wurde, wird eine session 'access' erzeugt. weiters gibt es einen link, der in den administratorbereich verlinkt, <a href="?admin">Optionen</a>. nun habe poste ich mal den code aus dem großen switch.
case ($_SESSION['access'] == true && (!isset($_GET['delete']) || !isset($_GET['writenews']) || !isset($_GET['logout'])) && isset($_GET['admin'])):
echo "Optionen! --- <a href="?admin&writenews">schreiben</a> - <a href="?admin&delete">löschen</a>";
break;
case ($_SESSION['access'] == true && isset($_GET['admin']) && isset($_GET['delete'])):
echo "Löschen - <a href="?admin&logout">ausloggen</a> - <a href="?admin">Optionen</a>";
break;
case ($_SESSION['access'] == true && isset($_GET['admin']) && isset($_GET['writenews'])):
echo "Löschen - <a href="?admin&logout">ausloggen</a> - <a href="?admin">Optionen</a>";
break;
case($_SESSION['access'] == true && isset($_GET['admin']) && isset($_GET['logout'])):
session_destroy();
echo "Sie wurden erfolgreich ausgeloggt! <a href="$name_of_page?admin">einloggen</a>";
break;
sobald $_SESSION['access'] gesetzt also == true ist, und auf den link geklickt wurde, wird ?admin an die url angehängt. da php ja bei jedem 'ereignis' das script neu startet wird demzufolge der erste case des switchs ausgefüllt, da nur ?admin in der url steht. - gebe ich jedoch ?admin&delete ein oder ähnliches, wird immer der oberste case ausgeführt, nie jedoch die anderen... und ich finde den fehler nicht.
wäre froh, wenn mir wer helfen kann
lg
azok
hast du mal mit vardump alle deine get und post vars ausspucken lassen..?
hi!
hast du mal mit vardump alle deine get und post vars ausspucken lassen..?
nein. eigentlich nicht
lg
azok
echo $begrueszung;
case ($_SESSION['access'] == true && (!isset($_GET['delete']) || !isset($_GET['writenews']) || !isset($_GET['logout'])) && isset($_GET['admin'])):
bei
$_SESSION['access'] == true
ist das "== true" überflüssig.[1]
bei ?admin&delete
$_SESSION['access'] == true --> true
&& (
!isset($_GET['delete']) --> false (isset => true; ! => false)
|| !isset($_GET['writenews']) --> true (isset => false; ! => true)
|| !isset($_GET['logout']) --> true (isset => false; ! => true)
) ergibt --> true
&& isset($_GET['admin']) --> true
Bedingung erfüllt
Wenn man bereits von der eigenen Programm-Logik verwirrt ist :-) , hilft es, sich Teilausdrücke mit var_dump() anzeigen zu lassen, um den Knoten aufzulösen.
echo "$verabschiedung $name";
[1] Es sei denn, du willst auch den Type mit überprüfen, dann ist aber ein === (3x) erforderlich.
hi!
echo $begrueszung;
&& isset($_GET['admin']) --> true
Bedingung erfüllt
dann hab ich bei mir aber einen gewaltigen knoten drin, denn ich komm nicht drauf, wie ich das sonst anstellen sollte...
lg
azok
Moin!
ich scripte nun (noch immer) an meinem weblog... - nun, leider treten beim login ein paar probleme auf.
Die Probleme entstehen aber woanders, als du glaubst erkannt zu haben. Ich hab die Überschrift mal entsprechend angepaßt.
sobald das password korrekt eingegeben wurde, wird eine session 'access' erzeugt.
Es ist immer hilfreich, beim Beschreiben der eigenen Programmschritte sprachlich exakt zu bleiben, damit die Anderen auch verstehen, was man meint. Und du meinst offensichtlich folgendes: "Sobald das Passwort korrekt eingegeben wurde, wird der Sessionwert "access" auf true gesetzt.
weiters gibt es einen link, der in den administratorbereich verlinkt, <a href="?admin">Optionen</a>. nun habe poste ich mal den code aus dem großen switch.
Deine URL-Parametergestaltung ist nicht wirklich der Aufgabe angepaßt.
echo "Optionen! --- <a href="?admin&writenews">schreiben</a> - <a href="?admin&delete">löschen</a>";
echo "Löschen - <a href="?admin&logout">ausloggen</a> - <a href="?admin">Optionen</a>";
echo "Löschen - <a href="?admin&logout">ausloggen</a> - <a href="?admin">Optionen</a>";
In allen Links erscheint immer der Parameter "admin". Warum? Dass der Link nur vom Admin aufgerufen werden kann bzw. nur dann Wirkung zeigt, stellst du mit dem Login sicher. Also kann dieser Teil entfallen.
Und warum arbeitest du je nach gewünschter Aktion mit ganz unterschiedlichen Parametern? Man kann doch in der Regel nur eine einzige Aktion per Klick auslösen - oder würde es sinnvoll sein, gleichzeitig zu löschen und sich auszuloggen (ein ?admin&delete&logout wäre URL-mäßig ja möglich).
Gerade weil du diese schlechte, d.h. der Aufgabe unangepaßte URL-Struktur gewählt hast, hast du im Endeffekt die Probleme mit deinem Switch.
Mein Vorschlag: Nimm nur einen einzigen Parameter für alles!
?admin=options (tut nix bzw. zeigt die "Optionen", wäre deinem alten ?admin entsprechend)
?admin=delete (für Löschen)
?admin=writenews (zum News schreiben)
?admin=logout (zum Ausloggen)
Daraus resultierend hast du es dann beim Switch nur noch mit einer einzigen Variablen zu tun, die zu einem gegebenen Zeitpunkt dann auch nur einen einzigen Wert annehmen kann, und keinerlei Dopplungen berücksichtigt werden müssen.
Und damit aus deinem Switch eine ordentliche Programmstruktur wird, solltest du hier auch so einfach wie möglich arbeiten:
if ($_SESSION['access'])
{
switch ($_GET['admin'])
{
case 'options': ...
break;
case 'delete': ...
break;
case 'writenews': ...
break;
case 'logout': ...
break;
default: ... //irgendwas ist falsch gelaufen, da sollte eine Fehlermeldung für "Unbekannter Befehl" kommen
}
}
Auf diese Weise erreichst du ein sehr übersichtliches Programm, bei dem in den Bedingungen absolut nichts mehr schiefgehen kann. Der Switch-Block wird nur erreicht, wenn die IF-Abfrage vorher ergeben hat, dass ein Admin angemeldet ist. Damit ist sichergestellt, dass nicht irgendwer durch Raten der URL die Adminfunktionen ausführen kann - sofern du nicht beim Admin-Login geschlampt hast. :)