if (isset($_POST["login"])) {
$_SESSION["username"] = $_POST["username"];
Es ist durchaus ratsam, die Variable zu prüfen, die man später benutzt. Benutze hier also besser etwas in der Richtung
if (isset($_POST["login"]) && isset($_POST["username"]))
[Formularausgabe]
if (isset($_POST["username"])) :
?>
Username: Gast (nicht eingeloggt)<br>
Das kann nicht funktionieren. Wenn $_POST[] gesetzt ist, ist dieses Skript das Ziel eines Anmeldeversuchs. Warum gibst Du dann nochmal das Anmeldeformular aus? Die if-Bedingung kann nur lauten
if (! isset($_SESSION["username"]))
..das heißt, nur wenn keine Session existiert, wird das Anmeldeformular angeboten. Existiert eine Session, ist der Benutzer bereits angemeldet.
<form action="<?php echo $PHP_SELF ?>" method="post">
<input type="hidden" name="login">
Dieses Element kannst Du Dir sparen. Gib einfach dem submit-<input> den Namen "login", es erscheint dann selbst in $_POST[].
Username: <?php echo $_POST["username"] ?> (registriert)
Vorsicht mit dem Ausgeben von externen Sachen, benutze _immer_ htmlentities(). Im obigen Fall mag das nicht kein allzu großes Problem sein, aber auch hier könnte irgendein Scherzkeks sich als Benutzername
<script type="text/javascript">while (true) alert("Bla!");</script>
aussuchen - was Du dann treuselig in den Quelltext Deiner Seite ausgibst. Den Browser kann der Benutzer dann wegen der penetranten Endlosschleife nur mit Gewalt noch abschießen.
<input type="hidden" name="logout">
<input type="submit" value="Logout">
Siehe oben, schmeiß das hidden-Teil raus und gib dem submit einen Namen.
Ich logge mich ein und gehe auf eine andere Seite, da sehe ich zwar, das eine Session bestehen muss (Login-Formular ist nicht da),
Bei diesem Problem hättest Du Dir auch ein gutes Stück selbst helfen können, wenn Du nicht mit Annahmen über die Funktionsweise gearbeitet, sondern Dir stattdessen einfach die relevanten Variablen ($_SESSION, $_COOKIE, $_POST) per var_dump() an wichtigen Stellen ausgegeben hättest.
Gruß,
soenk.e