Frage(n) zu Cookies & Sessions

$_SESSION ist fuer jede SessionID anders.
In der Regel wird fuer jede Session auf dem Server eine kleine Datei angelegt (automatisch, darum brauchst Du Dich nicht kuemmern) worin die Session-Daten (also z.B. die UserID und alles was Du da sonst noch reinschreibst) stehen.
Wenn nun ein User mit bereits bestehender Session ein Script ausfuehrt wird die fuer ihn (oder besser: seine SessionID) relevante Datei ausgelesen und $_SESSION mit diesen Informationen gefuettert.
 
Der User kann Cookies deaktiviert haben.
Dann funktioniert Dein Cookie nicht.
Dann funktioniert aber auch die transparente Session nicht (bei der der User auch ein Coockie bekommt) und Du musst dann die Session per URL übergeben (siehe dazu auch hier).
Es macht also nicht viel Sinn die Session im Coockie zu speichern.
Du könntest Dem User jedoch optional (wie hier im Forum) anbieten angemeldet zu bleiben.
Wenn er diese Option wählt, dann kannst Du die NutzerID auch im Coockie speichern und von dort auslesen ($_COOCKIE['NutzerID']).
Andernfalls speicherst Du die NutzerID in der Session und liest sie dann von dort aus ($_SESSION['NutzerID']).

Wenn sich ein zweiter User einlogt, bekommt er eine eigene SessionID wo dessen Daten gespeichert werden.
Allerdings kann eine Session auch von mehreren genutzt werden, wenn sie z.b. über die URL übertragen wird und so z.b. in einer Suchmaschine landet, per eMail verschickt wird oder sonst was (siehe Link).
 
Sehr gut.......
Das bringt ein wenig Licht ins Dunkel.
Also werde ich es so machen, dass ich nach erfolgreichem Login, die Session starte, die SessionID in einer Tabelle speicher und dann zum Test, ob der User eingelogt ist, diese dann mit dem Wert in der DB vergleichen.
Das erfordert allerdings, das bei fast jedem Seitenaufruf eine Verbindung zur DB hergestellt wird. Geht das nicht zu Lasten der Performance?
Gibt es nicht ne andere Möglichkeit?
 
Wenn Du nach dem erfolgreichen Login die UserID in die Session schreibst kannst Du Dir den Datenbankzugriff sparen.
Session leer = nicht eingeloggt
Session enthaelt UserID = eingeloggt
 
Hallo zusammen.

Dank eurer Tipps bin ich schon ein ganzes Stück weitergekommen........
Jetzt habe ich nur noch 2 Kleinigkeiten, die mich stören und wobei ich nen kleinen Tipp bräuchte.
Vielleicht hat ja jemand ne Idee......

Erstmal ne kurze Beschreibung.
Ich habe mir ein Layout mit DIV-Tags gebastelt.
Ein Container mit mit dem Inhalt, einer mit der Navigation und einer, inden das Loginskript inculded wird.

Jetzt kann ich mich einlogen und auslogen wie ich lustig bin. Es funktioniert sogar....:-) :-) :-)

Problem 1: Nach dem Logout, ist erst ein Klick auf einen Link (neue Seite) nötig, damit wieder das Login-Formular angezeigt wird. Schöner wäre es, wenn es sofort erscheint.

Problem 2: Die Geschichte mit den Fehlermeldungen ist noch nicht optimal gelöst.
Würde gerne alle Fehlermeldungen an einem bestimmten Ort anzeigen lassen.
Es müsste natürlich gewährleistet sein, dass diese auch nicht doppelt angezeigt werden.
Bspl.: 2 DB-Abfragen nicht, da die DB nicht existiert..........

Hoffe ich konnte mich verstädndlich genug ausdrücken.
Für andere Anregungen, bin ich auch sehr dankbar.......

Zum Schluss noch meine Dateien.....

1.php :

PHP:
<?php 
if (isset($_POST['sent']) AND $_POST['sent'] == 1 ) {

//echo "Daten wurden an 2.php gesendet";

include ("../.../2.php");

test_nutzer();

}

if (!isset($_POST['sent'])) {
	
?>

<form action="<?php echo $PHP_SELF; ?>" method="post">

	<input name="sent" type="hidden" value="1" />
	name:<input name="anmeldename" type="text" value="<?php echo $_POST['anmeldename']; ?>" />
	passwort:<input name="passwort" type="text" value="<?php echo $_POST['passwort']; ?>" />
	<input name="einlogen" type="submit" />

</form>

<?php 

}// Ende if(!$_POST['test'])

?>


2.php :

PHP:
<?php 

session_start();


include("../.../.../funktion_datenbankverbindung.php");
include("../.../login/abfrage_login_auswerten.php");


function test_nutzer () {

	include("../../login/abfrage_nutzer_vorhanden.php");


	$result = datenbankverbindung ($sql);

	abfrage_login_auswerten($result);

	if (isset($_SESSION['anmeldename'])) {
		
		//echo "Der Anmeldename lautet ".$_SESSION['anmeldename']."<br>und ist in Ordnung ";
		
		test_passwort ();
	}


	else {

		echo "<br>Es gibt keinen Nutzer: ".$_POST['anmeldename']."<br>in unserer DB ";
		
		unset ($_POST['sent']);
		
		return;
	}

} // Ende function nutzer_vorhanden

function test_passwort () {

	include("../.../login/abfrage_login.php");
	
	
	$result = datenbankverbindung($sql);

	abfrage_login_auswerten($result);
	

	if (($_POST['anmeldename'] == $_SESSION['anmeldename']) && ($_POST['passwort'] == $_SESSION['passwort'])) {
			
		$_SESSION['nutzerid'] = $_SESSION['id'];
		
		include("../.../login/eingelogt.php");
	}


	else {
		
		$meldung  = "Dein Loginversuch war nicht von Erfolg gekrönt.<br>";
		$meldung .= "Bitte versuche es erneut.<br>";
		
		if ($_POST['passwort'] == $_SESSION['passwort']) {
		
			echo "passwort stimmt";
		}
		
		else {
		
			$meldung .= "<br>Das eingegebene Passwort stimmt leider nicht.";
			
			echo $meldung;
			
			unset ($meldung);
			
			unset ($_POST['sent']);
			
			return;
		}
			
	}

} // Ende function datenabgleich


?>

eingelogt.php :

PHP:
<?php



if (isset($_POST['logout'])) {

	echo "Auf Wiedersehen ".$_SESSION['anmeldename'].".<br>Hoffentlich sehen wir uns bald wieder.";
	
	
	session_unset();
	session_destroy();
	
}

else {

echo "<br><br>Hallo ".$_SESSION['anmeldename'];
echo "<br><br>du bist eingeloggt";

?>

<form action="../.../index_neu.php" method="post">
<input name="logout" type="hidden" value="1" />
<input name="logout" type="submit" value="logout" />
</form>

<?php 

} // Ende else (isset($_POST['sent'])

?>
 
Zum 1. Problem: die Seite muss neu geladen bzw. umgeleitet werden.
Dieses erreichst Du in dem Du prüfst ob der Logout Button gedrückt wurde und dann mittels header() oder <meta>-Tag umleitest.
Z.b. so (gehört in den <head>-Bereich):
PHP:
<?php
if(isset($_POST['logout'])) {
    echo '<meta http-equiv="refresh" content="5; url=login.php">';
}
?>
So wird nach 5 Sekunden auf die login.php umgeleitet..... der User hat also noch 5 Sekunden Zeit den Abschiedsgruss zu lesen. ;)
Ich bin mir nicht ganz sicher, aber ich meine dass die Session vor der Weiterleitung gelöscht werden muss.

Zum 2. Problem: pauschal kann man die Frage nicht beantworten.
Du könntest aber z.b. mit if() abfragen ob z.b. die Datenbankverbindung zustande gekommen ist und dann weiter arbeiten.
Ist die if() Abfrage fehlgeschalgen, kannst Du beim else eine Variable mit einer Fehlermeldung definieren und diese Variable an jeder beliebigen Stelle ausgeben.
Kleines Beispiel an Hand eines Passwortvergleichs:
PHP:
<?php
if(isset($_POST['passort'])) {
    if($_POST['passowrt'] == $_POST['passwort_wiederholung']) {
        $ausgabe = "Passwort ist identisch.";
        $fehler = "";
    } else {
        $ausgabe = "";
        $fehler = "Passwort stimmt nicht überein.";
    }
} else {
    $ausgabe = "";
    $fehler = "";
}
 
echo $fehler;
echo $ausgabe;
?>
Damit es beim echo() mit error_reporting(E_ALL) nicht zu einem "Notice: Undefined index: ausgabe in....." bzw. "Notice: Undefined index: fehler in....." kommt, habe ich den Variablen entsprechend den Bedingungen einen leeren Wert zugewiesen.
 
Dennis Wronka hat gesagt.:
Wenn Du nach dem erfolgreichen Login die UserID in die Session schreibst kannst Du Dir den Datenbankzugriff sparen.
Session leer = nicht eingeloggt
Session enthaelt UserID = eingeloggt


Wenn er die Session erst nach einem erfolgreichen Login startet, kann er auch über einfach schaun ob eine Session existiert...

Schönes Thema...dazu hab ich auch gleich mal eine Frage, den ich habe mal gehört, das die session schon am anfang gestartet werden, wenn der headeran den Server gesendet werden muss, jedoch gehts auch wenn mans erst nach dem Login macht....

Wenn die session einmal gestartet ist, muss man sie nicht mehr Starten, jedoch warum ist das bei dem TuT von Karl Förster übers Loginsystem anders?
 
Hallo zusammen........

Habe mal versucht, dass Problem mit den Fehlermeldungen zu lösen.
In der einen Datei, klappt das auch wunderbar, aber von der 2. Datei, kriege ich irgendwie nix zurück........
Habe schon alles mögliche versucht, aber weiss jetzt nicht mehr weiter.....
Vielleicht kann mir jemand einen Tip geben......

login.php


PHP:
<?php 

// Prüfung ob Formular gesendet wurde
if (isset($_POST['sent'])) {

	// Prüfung ob ein Anmeldename eingegeben wurde
	if (empty($_POST['anmeldename'])) {

		$meldung .= "<br>Es wurde kein Anmeldename eingegeben.";
		unset ($_POST['sent']);
	}

	else {

		$meldung .= "";
	}
	
	// Prüfung ob ein Passwort eingegeben wurde
	if (empty($_POST['passwort'])) {

		$meldung .= "<br>Es wurde kein Passwort eingegeben.";
		unset ($_POST['sent']);
	}

	else {

		$meldung .= "";
	}
	
	// Prüfung ob Anmeldename und Passwort eingegeben wurden
	if ((!empty($_POST['anmeldename'])) && (!empty($_POST['passwort']))) {
	 
		include ("../.../login/test_login.php");
		
		test_nutzer();
	}
		
} //Ende (isset($_POST['sent']))

// Prüfung ob noch nicht abgesendet wurde
if (!isset($_POST['sent'])) {

	// Prüfung ob Meldungen vorhanden sind
	if (!empty($meldung)) {

		echo $meldung;
	}

?>

<form action="../.../index_neu.php" method="post">

	<input name="sent" type="hidden" value="1" />
	name:<input name="anmeldename" type="text" value="<?php echo $_POST['anmeldename']; ?>" />
	passwort:<input name="passwort" type="text" value="<?php echo $_POST['passwort']; ?>" />
	<input name="einloggen" type="submit" />

</form>

<?php 

}// Ende (!isset($_POST['sent'])

?>


test_login.php

PHP:
<?php 

session_start();


include("../.../datenbank/funktion_datenbankverbindung.php");
include("../.../login/funktion_abfrage_login_auswerten.php");


function test_nutzer () {

	include("../.../login/abfrage_nutzer_vorhanden.php");


	$result = datenbankverbindung ($sql);

	abfrage_login_auswerten($result);

	if (isset($_SESSION['anmeldename'])) {
		
		$meldung .= "Der Anmeldename lautet ".$_SESSION['anmeldename']."<br>und ist in Ordnung ";
		test_passwort ($meldung);
	}


	else {

		$meldung .= "<br>Es gibt keinen Nutzer: ".$_POST['anmeldename']."in unserer DB ";
		
		unset ($_POST['sent']);

		return $meldung;
	}

} // Ende function nutzer_vorhanden

function test_passwort ($meldung) {

	include("../.../login/abfrage_login.php");
	
	
	$result = datenbankverbindung($sql);

	abfrage_login_auswerten($result);
	

	if (($_POST['anmeldename'] == $_SESSION['anmeldename']) && ($_POST['passwort'] == $_SESSION['passwort'])) {
			
		$_SESSION['nutzerid'] = $_SESSION['id'];
		
		$meldung .= "Login erfolgreich"; 
		include("../.../login/eingeloggt.php");
	}


	else {
		
		if ($_POST['passwort'] == $_SESSION['passwort']) {
		
		}
		
		else {
		
			$meldung .= "<br>Das eingegebene Passwort stimmt leider nicht.";
			
			unset ($_POST['sent']);
			
			return $meldung;
		}
			
	} // Ende else (($_POST['anmeldename'] == $_SESSION['anmeldename']) && ($_POST['passwort'] == $_SESSION['passwort']))

} // Ende function datenabgleich

?>

Im Falle eines Fehlers, soll die Meldung dann überhalb des Formulars aus login.php angezeigt werden.
 
Ich dachte Funktionen sind so mehr oder weniger das Allheilmittel.......
Wie schreibst du denn deine Skripte

Es hat übrigens funktioniert..........
Danke
 
Zurück