Sven Rautenberg: Problem mit Switch

Beitrag lesen

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. :)

  • Sven Rautenberg