Sessionbasierter Login:

Zneaf

Erfahrenes Mitglied
Hi Leute,

ich arbeite derzeit an meinem sessionbasierten Login.

Die momentane Situation:

Wenn sich ein User einloggt, soll er eingeloggt bleiben, bis er sich selbst ausloggt.
Aus diesem Grund speichere ich bestimmte Daten des Users in Sessions ab.
Nach dem sich ein User eingeloggt hat, wird er dann zu einer Seite weitergeleitet, in dem steht, ob sein login erfolgreich oder nicht erfolgreich war und anschließend auf die Startseite.
Das funktioniert soweit auch.
Dort möchte ich dann überprüfen, ob "$_SESSION['loggedIn'] == true" ist oder nicht.
Wenn diese Session true ist, heißt das, dass man eingeloggt ist.
Dann soll "Hallo *Benutzername*" angezeigt werden.
Ist die Session nicht true, soll "Hallo Gast" angezeigt werden.
Das habe ich auch schon so programmiert.
Das Problem an der ganzen Sache ist, dass ich auch nach dem Login (der auch erfolgreich war) immernoch "Hallo Gast" angezeigt bekomme.
D.h. irgendwo muss der Wurm drin sein...
Ich vermute mal, dass ich ein Fehler im "Abrufen" des Loginstatus habe oder im "Abspeichern" des Loginstatus ($Session['loggedIn']).

Hier mein Login-Script:
PHP:
<?php session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
</head>
<body link="#333333" vlink="#333333" alink="#333333">

<?php	
    // Überprüfen, ob das Formular abgeschickt wurde und ob beide Angaben gemacht wurden.
    if( isset($_POST['username'], $_POST['password'])
        AND
			strcmp(trim($_POST['username']),'') != 0
        AND
			strcmp(trim($_POST['password']),'') != 0 ) {

				// Einbinden der Login - Konfigurationsdatei.
				include_once 'loginconfig.php';

				// Verbindung mit MySQL-Datenbank herstellen.
				if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) {
					die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' );
				}

				if( !mysql_select_db( $_config['database'], $connection ) ) {
					die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br />
                    MySQL-Error: <br />' . mysql_error() );
				}

				// SQL-Anweisung an die Datenbank senden, um erstens herauszufinden, ob 
				// diese Kombination von Usernamen und Password überhaupt existiert und 
				// zweitens bei Existenz die Userinformationen auszulesen.
				$sql = "SELECT 
							userid,
							username,
							password,
							acclevel
						FROM         
							user
						WHERE
							username = '" . trim($_POST['username']) . "'
						AND
							password = '" . md5(trim($_POST['password'])) . "'";
                           
				$res = mysql_query($sql) or die( 'Error[SELECT|User]: <br />
                                                           <pre>' . $sql . '</pre>
                                                           <br />
                                                           MySQL-Error: ' . mysql_error() );

				// Nur wenn genau ein Datensatz selektiert wurde, wird der User eingeloggt.
				// Ansonsten wird ihm eine Fehlermeldung angezeigt und 5 Sekunden später zum Loginformular zurückgeleitet.
				if( mysql_num_rows($res) != 1 ) {
					echo "<meta http-equiv='refresh' content='0; url=index.php?site=loginfailed'>";
					exit();
				}
				else {
					// Der Schlüssel 'loggedIn' erhält den Wert 'true'. So kann überprüft später werden, 
					// ob der User eingeloggt ist oder nicht.
					$_SESSION['loggedIn'] = true;
					
					// Die userspezifischen Daten werden ausgelesen und der Session hinzugefügt.
					$user = mysql_fetch_object($res);
					$_SESSION['userid'] = $user->userid;
					$_SESSION['username'] = $username->id;
					$_SESSION['acclevel'] = $acclevel->acclevel;

					// Der Login war erfolgreich und der User bekommt eine Erfolgsmeldung angezeigt.
					echo "<meta http-equiv='refresh' content='0; url=index.php?site=logingranted'>";
					exit();                                            
				}

			}
?>

<img src="/images/anmelden_head.jpg" width="526" height="26"><br><br>
<center>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post"> 
<table border="0" cellpadding="0" cellspacing="2">
	<tr>
	<td width="10">&nbsp;</td>
		<td><font face="Arial" color="333333">Username:</font></td>
	</tr>
	<tr>
		<td width="10">&nbsp;</td>
		<td><input type="text" name="username" size="25" maxlength="25"></td>
	</tr>
	<tr>
		<td width="10">&nbsp;</td>
		<td><font face="Arial" color="333333">Passwort:</font></td>
	</tr>
	<tr>
		<td width="10">&nbsp;</td>
		<td><input type="password" name="password" size="25" maxlength="25"></td>
	</tr>
	<tr>
		<td width="10">&nbsp;</td>
		<td></td>
	</tr>
	<tr>
		<td width="10">&nbsp;</td>
		<td><input type="submit" name="login" value="Anmelden">&nbsp;<input type="reset" value="Abbrechen" name="reset"></td>
	</tr>
</table>
</form>
</center>
</body>
</html>
Es wäre vielleicht gut, zu erwähnen, dass das Design der Website fest definiert ist und nur der Inhalt in einer bestimmten Zeile der Tabelle aufgerufen wird.

Hier noch eine Frage: Wenn sich der User eingeloggt hat und zur Startseite weitergeleitet wird, muss ich dann in der index.php (in der das Design festgelegt ist und in der definiert ist, in welcher Zeile der Tabelle der Inhalt geladen wird) einen bestimmten Code zur Überprüfung des logins einfügen?

Bisher habe ich nur:
PHP:
<?php if($_SESSION['loggedIn'] == true){
     echo "<div class=\"text\"><font face=\"Arial\" color=\"#333333\">
               &nbsp;&nbsp;&nbsp;Hallo <b>".$_SESSION['username']."</b></font></div>";
     } else { echo "<div class=\"text\"><font face=\"Arial\" color=\"#333333\">
               &nbsp;&nbsp;&nbsp;Hallo <b>Gast</b></font></div>"; }?>

Puh....hoffe ich konnte mein Problem einigermaßen verständlich erklären.
Falls ihr Fragen habt, so stellt diese bitte ;)

Für eventuelle Einrückfehler entschuldige ich mich im Voraus, da es gut sein kann, dass es hier im Explorer nicht exakt so übernommen wurde, wie es in meinem Script ist.

Zu erwähnen wäre vielleicht noch, dass ich rein Hobby-mäßig programmiere und ihr daher nachsichtig mit mir umspringen solltet, wenn ich nicht direkt alles verstehe =)

Vielen Dank für euer Verständniss und eure Hilfe.
Hoffe ihr könnt mir weiterhelfen.

LG Zneaf ;)
 
Sorry, über tutsmobile gepostet, hat wohl was verhauen. Hier nochmal ueber safari:

Moin,

Ich versteh da ein paar sachen nicht...

Wo ist die ausgabe "Hallo Gast"? Auf der weitergeleiteten seite? Wird dort der username richtig aus der session geholt?

Du hast dein $user array, wo kommt dann dann $username->id her? Meinst evtl. $user->username (passt so eher zu deiner sql query)? Das selbe bei acclevel, oder hast du noch weitere abfragen ausgeführt die man nicht sieht?

Warum benutzt du meta-refresh's? Nimm lieber header-location mittels php. Es soll browser geben, da muss der user erst dem browser erlauben solchen refreshs zu folgen ;)

*Hoffe dir etwas geholfen zu haben :)
 
Heyho zusammen ;)

zuerst einmal vielen Dank an euch beiden =)

@bernd00:

also die Ausgabe "Hallo Gast" ist auf der index.php
Diese ist ja wie erwähnt meine Design Datei, die eine Tabellen Struktur besitzt.
Damit bezwecke ich, dass nur der Inhalt der einzelnen Seiten (z.B. Gästebuch, Home, News...) in einem bestimmten Teil der Tabelle geladen wird und nicht das komplette Design neu geladen wird.
Die Seite, die dem User angezeigt wird, nachdem er versucht hat sich ein zu loggen ist nur eine Seite, die ihm anzeigt, ob der login erfolgreich war oder nicht. Von dort aus wird er dann zur Startseite weitergeleitet.

Desweiteren hast Du Recht mit deiner Vermutung bezüglich des "$user array's":

Sollte eigentlich so aussehen:

Code:
// Die userspezifischen Daten werden ausgelesen und der Session hinzugefügt.
$user = mysql_fetch_object($res);
$_SESSION['userid'] = $user->userid;
$_SESSION['username'] = $user->username;
$_SESSION['acclevel'] = $user->acclevel;

Das waren alle Abfragen, die ich ausgeführt habe.
Habe euch den gesamten login-code gepostet.

Mache ich vielleicht einen Fehler beim Abfragen oder Abspeichern der Daten in den Sessions oderso?
Wie müssen die Daten übergeben oder abgespeichert werden, dass sie erhalten bleiben, bis sich der user ausloggt? Oder stimmt das so, wie ich es gemacht habe? :)

Ist sonst noch irgendwo der Wurm drin?^^

Falls ihr sonst noch irgendwelche Fragen haben solltet, sagt bitte bescheid =)

Die Meta-refresh's benutze ich, weil die header-location-funktion bei mir iwie nie funktioniert hat ;)

Für eure Hilfe bedanke ich mich wieder im Voraus ;)

LG Zneaf
 
Falls ihr euch für die Datei interessiert, die dem user sagt, ob der login erfolgreich war oder nicht:

hier die Datei für den Fall, dass der login nicht erfolgreich war(loginfailed.php):

Code:
<html>
<head>
<title>Login fehlgeschlagen</title>
</head>
<body link="#333333" vlink="#333333" alink="#333333">
<meta http-equiv='refresh' content='5; url=index.php?site=login'>
<img src="/images/anmelden_head.jpg" width="526" height="26"><br><br>
<center>
<table width="500" align="center" border="0" cellpadding="0" cellspacing="2">
	<tr>
		<td><font face="Arial" color="#333333"><center>Der Login ist fehlgeschlagen!</center></font></td>
	</tr>
	<tr>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><font face="Arial" color="#333333">Möglicherweise sind die angegebenen Benutzerdaten nicht korrekt.</font></td>
	</tr>
	<tr>
		<td><font face="Arial" color="#333333">Bitte überprüfen Sie Ihre Daten und versuchen Sie es dann erneut.</font></td>
	</tr>
	<tr>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><font face="Arial" color="#333333">Nach 5sec. werden Sie automatisch zum Loginformular weitergeleitet.
			Andernfalls klicken Sie <a href="index.php?site=login"><b>hier</b><a>.</font></td>
	</tr>
</table>
</center>
</body>
</html>

und hier ist die Datei für den Erfolgsfall (logingranted.php):

Code:
<html>
<head>
<title>Login erfolgreich</title>
</head>
<body link="#333333" vlink="#333333" alink="#333333">
<meta http-equiv='refresh' content='5; url=index.php?site=home'>
<img src="/images/anmelden_head.jpg" width="526" height="26"><br><br>
<center>
<table width="500" border="0" cellpadding="0" cellspacing="2">
	<tr>
		<td><font face="Arial" color="#333333"><center>Du hast Dich erfolgreich eingeloggt!</center></font></td>
	</tr>
	<tr>
		<td>&nbsp;</td>
	</tr>
	<tr>
		<td><font face="Arial" color="#333333">Du wirst automatisch zur Startseite weitergeleitet.</font></td>
	</tr>
	<tr>
		<td><font face="Arial" color="#333333">Andernfalls klicke <a href="index.php?site=home"><b>hier</b><a>.</font></td>
	</tr>
</table>
</center>
</body>
</html>

Diese sind relativ simpel, wie ihr seht.

LG Zneaf ;)
 
Also wenn ich das jetzt richtig verstehe, dann wird man nach erfolgreichem Login auf die Seite "logingranted.php" umgeleitet.

Das was do oben von der Seite zu sehen ist, ist aber reines HTML. Es fehlt "session_start()" und somit wird direkt beim Anzeigen das der Login erfolgreich war die Session zerstört und man ist wieder abgemeldet.
 
Hey tombe,

stimmt alles, was du gesagt hast.

Hab das session_start() eingefügt.
Allerdings funktioniert es immernoch nicht.

Haste noch ne andere Idee oder muss ich dazu noch etwas schreiben?

LG Zneaf ;)
 
Habe mich oben vielleicht zu kurz gefasst bzw. hast du dir mal angeschaut wo "session_start()" überall stehen muss.

Auf allen Seiten wo die Session benötigt/benützt wird, muss diese Anweisung als erste Anweisung auf der Seite stehen.

Ich denke mal das bei dir da irgendwo noch eine Seite ist bei der das fehlt.
 
Hallo,

so ganz richtig habe ich das wohl imme rnoch nicht durchdrungen. Also du hast irgendwo eine Loginseite (wie kommt man auf die Seite bzw. von welcher Seite aus?). Dann hast du noch eine index.php ähm aha und dann wird, bei erfolgreichem Login auf die Startseite refrecht.
Ohne jetzt die genauen Zusammenhänge deiner einzelnen Seiten zu kennen drängt sich mir auf das ganze Logingesums in die index.php einzubinden (alle abfragen und Fehlerhinweise dort zu plazieren) und wenn der Login ok ist dann auf die Startseite zu refreshen. oder so.

PHP:
<?php 
error_reporting(E_ALL);
session_start();
?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
       "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>Login</title>
</head>
<body link="#333333" vlink="#333333" alink="#333333">

<?php 
if ( isset($_POST['username'], $_POST['password'])
        &&
            strcmp(trim($_POST['username']),'') != 0
        &&
            strcmp(trim($_POST['password']),'') != 0 ) {
			
  		// Einbinden der Login - Konfigurationsdatei.
 		include_once 'loginconfig.php';
  
  
                // Verbindung mit MySQL-Datenbank herstellen.
                if( !$connection = mysql_connect( $_config['host'], $_config['user'], $_config['password'] ) ) {
                    die( 'Verbindung zum Datenbankserver konnte nicht hergestellt werden.' );
                }

                if( !mysql_select_db( $_config['database'], $connection ) ) 
				{
                    die ( 'Die Datenbank ' . $_config['database'] . ' kann nicht verwendet werden. <br />
                    MySQL-Error: <br />' . mysql_error() );
                }   

$sql = "SELECT 
					userid,
					username,
					password,
					acclevel
					
		  FROM 		user

		  WHERE		username = '" . trim($_POST['username']) . "'

			AND		password = '" . md5(trim($_POST['password'])) . "'";
                           
    $res = mysql_query($sql) or die( 'Error[SELECT|User]: <br />
                                                           <pre>' . $sql . '</pre>
                                                           <br />
                                                           MySQL-Error: ' . mysql_error() ); 

// ---------- es wurde nicht genau ein Datensatz gefunden - Fehler ----------
if( mysql_num_rows($res) != 1 ) 
  {
?>
<center>
<table width="500" align="center" border="0" cellpadding="0" cellspacing="2">
    <tr>
        <td><font face="Arial" color="#333333"><center>Der Login ist fehlgeschlagen!</center></font></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td><font face="Arial" color="#333333">Möglicherweise sind die angegebenen Benutzerdaten nicht korrekt.</font></td>
    </tr>
    <tr>
        <td><font face="Arial" color="#333333">Bitte überprüfen Sie Ihre Daten und versuchen Sie es dann erneut.</font></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td><font face="Arial" color="#333333">zurück zum Login <a href="index.php?site=login"><b>hier</b><a>.</font></td>
    </tr>
</table>
</center>
<?php
// ---------- Login war erfolgreich ----------
}else {
  $_SESSION['loggedIn'] = true;
                    
  $user = mysql_fetch_object($res);
  $_SESSION['userid'] = $user->userid;
  $_SESSION['username'] = $username->id;
  $_SESSION['acclevel'] = $acclevel->acclevel;
?>
<img src="/images/anmelden_head.jpg" width="526" height="26"><br><br>
<center>
<table width="500" border="0" cellpadding="0" cellspacing="2">
    <tr>
        <td><font face="Arial" color="#333333"><center>Du hast Dich erfolgreich eingeloggt!</center></font></td>
    </tr>
    <tr>
        <td>&nbsp;</td>
    </tr>
    <tr>
        <td><font face="Arial" color="#333333">Du wirst automatisch zur Startseite weitergeleitet.</font></td>
    </tr>
    <tr>
        <td><font face="Arial" color="#333333">Andernfalls klicke <a href="index.php?site=home"><b>hier</b><a>.</font></td>
    </tr>
</table>
</center>
<?php
// ---------- submit bzw. Anmelden wurde noch nicht gedrückt - Formularausgabe ----------
}
}else {
?>
<img src="/images/anmelden_head.jpg" width="526" height="26"><br><br>
<center>
<form action="<?php $_SERVER['PHP_SELF']; ?>" method="post"> 
<table border="0" cellpadding="0" cellspacing="2">
    <tr>
    <td width="10">&nbsp;</td>
        <td><font face="Arial" color="333333">Username:</font></td>
    </tr>
    <tr>
        <td width="10">&nbsp;</td>
        <td><input type="text" name="username" size="25" maxlength="25"></td>
    </tr>
    <tr>
        <td width="10">&nbsp;</td>
        <td><font face="Arial" color="333333">Passwort:</font></td>
    </tr>
    <tr>
        <td width="10">&nbsp;</td>
        <td><input type="password" name="password" size="25" maxlength="25"></td>
    </tr>
    <tr>
        <td width="10">&nbsp;</td>
        <td></td>
    </tr>
    <tr>
        <td width="10">&nbsp;</td>
        <td><input type="submit" name="login" value="Anmelden">&nbsp;<input type="reset" value="Abbrechen" name="reset"></td>
    </tr>
</table>
</form>
</center>
</body>
</html>
<?php
}
	
?>

Ich persönlich würde mir den Teil "erfolgreich eingeloggt" bestätigen schenken (logingranted.php) und gleich auf die Startseite "gehen". Wenn der User begrüßt wird ist doch klar das alles ok ist, oder? - Hab jetzt trotzdem einfach mal so deinen Code rein.
Mich wundert eh wo du den Code raus gekramt hast HTML 4.01**** Layout "getablet"?
So in etwa wie ich es zusammengestrickt habe sollte es klappen (ungetestet).
Gruß
strolch.007
 
Hey Leute ;)

vielen Dank für eure Hilfe! Ihr wart super!

Hab das Problem nun beseitigt....

es war exakt so, wie tombe gesagt hat: es gab noch eine Seite auf der die session_start() gefehlt hatte.
Nun funktioniert alles perfekt ;) *JUHU*

@tombe: VIELEN VIELEN VIELEN DANK =)

@trolch_007:

Die index.php ist das gesamte Design der Website. D.h. im Klartext, dass das Design der Website nur ein einziges mal geladen werden muss, da der inhalt der einzelnen Seiten wie z.b. login, news, home etc. in der Mitte des Designs geladen wird. D.h. man ladet nicht das ganze Design runter, wenn man auf nen link klickt um z.b. das loginformular aufzurufen, sondern nur die einzelnen Seiten wie z.b. login, news, home etc.

Hoffe du verstehst nun das prinzip^^

Vielen Dank an ALLE freundlichen Helfer hier ;)

LG Zneaf
 

Neue Beiträge

Zurück