Andreas Korthaus: Userbereich

Beitrag lesen

Hallo!

Ich bin gerade dabei, einen Userbereich in PHP zu erstellen.

Dazu habe ich probeweise zwei Dateien angelegt (start.php und chat.php)

Es ist nicht so eifnahc sich in sowas als au0enstehendewr einzudenken. Daher solltest Du das egentliche Problem isolieren. Dann kannst Du es auch erheblich besser selbst lösen. Beim Debuggen helfen Dir Funktionen wie var_dump(), mit denen Du alle verfügbaren Angaben zu einer Variable bekommst, egal welchen Typs. So ist es z.B. immer sehr interessant var_dump($_SESSION) auszugeben um zu sehen was genau in der Session steht. Genauso ist es interessant var_dump($_POST) oder var_dump($_GET) auszugeben.

Du solltest Dir immer _so_viel_wie_möglich_ ausgeben! Einfach echo "Meldung blabla" in den verschiedenen Zweigen einer if-Kntroll-Struktur, um zu sehen wo genau Du bei einer If-Abfrage rauskommst.

Außerdem solltest Du Dir ganz in Ruhe
http://de3.php.net/manual/de/ref.session.php und
http://www.dclp-faq.de/ch/ch-version4_session.html

durchlesen.

In beiden Dateien steht:

in beiden? Das darfst Du nur auf der Login-Seite machen.

<?php

session_start();

if ($HTTP_POST_VARS[$login]) {

was steht in $login?
gebe mal var_dump($HTTP_POST_VARS) aus um zu sehen was da drin steht.

und dann, genau an dieser Stelle hier sowas wie:

echo "if (ligin) hat geklappt!";

Dann siehst Du an der Ausgabe ob die If-Abfrage wenigstens funktioniert.

session_register("username");
session_register("passwort");

Woher kommen username und passwort? Eine erheblich bessere Schreibweise(steht auch so in den oben verlinkten Artikeln) wäre:

$_SESSION["username"] = $_POST["username"];

Wobei hier unbedingt eine Prüfung erfolgen sollte! Aber das war Dir ja bewußt.

}
elseif ($HTTP_POST_VARS[$logout]) {

genau wie oben

session_destroy();
}

echo "<br><br><br><hr>";

Du solltest Dir in jedem if-Zweig eine Meldung ausgeben lassen, damit Du weißt was genau ausgeführt wird!

?>

<?php
if (!$username) :

Diese Schreibweise von Kontrollstrukturen eignet sich IMHO nicht unbedingt für größere Konstrukte.

Und hier sieht man sehr schön wie gefährlich der unbedarfte Einsatz von globalen Variablen ist:

ich übergene Deinem Scirpt einfach script.php?username=quatsch und schon bind ich eingeloggt, zumindest wenn Du es hier nicht prüfts da Du davon ausgehst das es sich um eine Session-Variable handelt. Verwende als immer $_SESSION["username"] oder $_POST["username"], je nachdem was Du halt erwartest.

?>
Username: Gast (nicht eingeloggt)<br>
<form action="<?php echo $PHP_SELF ?>" method="post">
<input type="hidden" name="login">
Username: <input type="text" name="username"><br>
Passwort: <input type="text" name="passwort"><br>
<input type="submit" value="Login">
</form>
<?php
else :
?>
Username: <?php echo $username ?> (registriert)
<form action="<?php echo $PHP_SELF ?>" method="post">
<input type="hidden" name="logout">
<input type="submit" value="Logout">
</form>
<?php
endif;
?>

<br>
<a href="chat.php4">Chat</a>

Nur die letzte Zeile (<a href="chat.php">Chat</a>) ist in der Datei chat.php:
<a href="start.php">Start</a>

Wenn ich mich nun auf der Seite start.php einlogge (beliebiger Username und beliebiges Passwort - wird erstmal noch nicht überprüft), dann werden die Daten, wie vorgesehen, an dieselbe Seite (start.php) wieder gesendet und ich bin eingeloggt. Wenn ich nun aber auf der Seite start.php den Link zu chat.php anklicke, dann bin ich auf der Seite chat.php nicht mehr eingeloggt. Die Sessiondaten scheinen irgendwie verloren gegangen zu sein.

Das ist schwer zu sagen woran das liegt, das kann zig Ursachen haben.
Zum einen verwendest Du sehr alte Schreibweisen die nicht unbedingt von aktuellen PHP-Versionen unterstützt werden, lies dazu die Links im Manual.
Es ist auch möglich das die SessionID nicht per Cookie oder URL übergeben wurde, da die php.ini nicht entsprechend eingestellt ist.  Du solltest Dir auf beides Seite die SessionID ausgeben lassen, mit: echo session_id();
Dass solltst Du Dir $_SESSION ausgeben lassen, um zu sehen was in der Session steht. Und passe die Schreibweisen entsprechend an.(post, get, session). Gebe Dir alles aus was Du Dir ausgeben kannst, udn vereinfache das Problem, versuche vielleicht erstmal einfach nur eine SessionID auf eine andere Seite zu übergeben, undabhängig von den Prüfungen, dem Formular.

Grüße
Andreas

Insgesamt soll es möglich sein, sich auf jeder Seite (also bisher nur start.php und chat.php) ein- und auszuloggen.

Was mache ich da bloß falsch?

Lukas Oklener