PHP Session Variable kann nicht ausgelesen werden

Atreju93

Lieutenant
Registriert
Nov. 2010
Beiträge
594
Hallo zusammen

Ich bin totaler PHP - Neuling, ich beherrsche jedoch c# als Objektorientierte sprache und bin in Webtechnologie auch kein Neuling. Daher kann ich mir vieler erraten, wie es in PHP funktioniert, doch hier komme ich selbst mit Google nicht darauf:

Ich bin daran eine Umfragewebsite zu gestalten mit einem Login, welches die Logindaten in eine Textdatei abspeichert bzw. ausliest. Die Antworten zu den Fragen werden ebenfalls in eine Textdatei gespeichert.

Damit später die Antworten einem User zugewiesen werden können, muss ich bei der Auswertung den Benutzernamen des aktuellen Benutzers wissen und mit in die Textdatei schreiben. Daher würde ich gerne Sessions verwenden.

bei der login.php datei habe ich folgenden Code:

Code:
<?php
session_start();
$_SESSION["username"] = $username;
?>
<html>
<head>
<title>Login</title>
<meta name="author" content="Andavos">
<meta name="generator" content="Ulli Meybohms HTML EDITOR">
		<link href="css/umfrage_style.css" rel="stylesheet" type="text/css" />
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">


<br><br>



<?php

$username = $_POST["username"];
$passwort = $_POST["password"];
$passwort = md5($passwort);
$log=0;

$userdatei = fopen ("user.txt","r");
while (!feof($userdatei))
   {
   $zeile = fgets($userdatei,500);
   $userdata = explode("|", $zeile);

   if ($userdata[0]==$username and $passwort==trim($userdata[1]))
      {
      $log = 1;
	  header("location:kategorie.php");
      }
   }
fclose($userdatei);

if ($log==0)
   {
   ECHO "	<p>Zugriff verweigert, Benutzername oder Kennwort falsch</p>
			<a href=\"index.php\">Zur¬&uuml</a>";
   }


?>

Ich habe die Session initialisiert und eine Variable "Username" inder Superglobalen Variable $_SESSION angelegt. Darin soll die lokale Variable "Username" vom Script abgelegt werden. Soweit treten keine Fehler auf, wobei ich nicht weiss, ob das Script auch das macht.

wenn ich jedoch am Ende mit dem Script auswerten.php die Daten in die Textdatei schreiben möchte, findet er die Variable "username" in $_SESSION["username"] nicht. Der Fehler lautet:
Code:
Notice: Undefined index: username in C:\xampp\htdocs\Umfrage\fragen\auswerten.php on line 4

Notice: Undefined index: username in C:\xampp\htdocs\Umfrage\fragen\auswerten.php on line 11
Antworten erfasst
zum Login

Hier wäre der Code von auswerten.php. Ist sicherlich nur eine Kleinigkeit, aber ich komm einfach nicht drauf, was ich falsch mache!

Code:
<?php
session_start();

$username = $_SESSION["username"];

if( isset( $_POST["Frage1"])) {
$antwort1 = $_REQUEST["Frage1"];
$antwort2 = $_REQUEST["Frage2"];
//Echo $antwort1;
//Echo $antwort2;
ECHO $_SESSION["username"];

      $antwortdatei = fopen ("../antworten/antworten.txt","a");
	  fwrite($antwortdatei, $username);
      fwrite($antwortdatei, "|");
      fwrite($antwortdatei, $antwort1);
      fwrite($antwortdatei, "|");
      fwrite($antwortdatei, $antwort2);
      fwrite($antwortdatei, "\n");
      fclose($antwortdatei);
      echo "$username Antworten erfasst<br><a href=\"../index.php\">zum Login</a>";
}
else {
ECHO "Es wurde keine Auswahl getroffen";
}
?>

Gruss und Dank im Voraus
Atreju
 
Bei php musst du immer überprüfen ob die Variable existiert. Es bringt dir nichts wenn du diese Vorher anlegst.

Schreibe besser
PHP:
<?php
session_start();

if(isset($_SESSION['username'])) {
   $username = $_SESSION["username"]);
} else {
  $username = false;
}
...

[edit]
Du musst das jedesmal überprüfen, da die Session ja in der zwischen Zeit ablaufen könnte und somit nicht mehr existiert.
[/edit]

PS: Schreib bitte ECHO klein, das sieht so schrecklich aus ;-)
 
Zuletzt bearbeitet:
Also mir ist nicht bewusst, warum ich zuerst überprüfen muss, ob die Variable existiert..? Angelegt ist angelegt, oder? Oder meinst du einfach jetzt zu Debugzwecken?

PS:
Ich war mal leidenschaftlicher CMD - Scriptler, da schreib ich das ECHO gross..;-)
 
Sessions haben allgemein eine Ablaufzeit nachdem sie verschwinden. z.B. 60 Sekunden (das kann man einstellen)

Wenn du nun in der einen Datei eine Variable anlegst die leer ist und diese später mit einem Wert überschreibst erfüllt das den gleichen zweck. Die Session zeit hängt nicht von dem Punkt ab in dem du etwas in die Variable schreibst sondern von session_start().

Da das Abfragen des Sessioninhaltes in einer neuen Datei erfolgt wird mit session_start die Session gestartet. Dies heißt aber nicht das es die gleiche Session ist die auch zuvor gestartet wurde. Wenn die Datei z.B. 60 Sekunden später gestartet wird, existiert deine angelegte Variable nicht mehr. Aus diesem Grund musst du überprüfen ob dein Inhalt noch vorhanden ist. Diese Überprüfung muss bei einer Variable durchgeführt werden, falls eine oder mehrere Variablen angelegt wurden.

Die 60 Sekunden könnten z.B. entstehen wenn der Server überlastet ist. In deinem Fall gehst du davon aus das das Script auch sofort ausgeführt wird. (was ja auch meistens der Fall ist, aber ist es immer so ? Kannst du dafür garantieren das es immer so sein wird ?)

Aus diesem Grund musst du einmal abfragen ob die Variable(n) existiert.


[edit]
Du musst auch noch eine Abfrage einbauen, so das die Auswert.php nicht immer einen Eintrag in die txt Datei schreibt. Ansonsten ist es möglich das die txt Datei bei einer Fehlerhaften Anwendung (Hack, oder sonst was) schnell größer wird als dein Onlinespeicherplatz.
[/edit]
 
Zuletzt bearbeitet:
Ahso meinst du. Also ich habe es überprüft und die Variable existiert nicht. Jedoch vergehen villeicht 5 Sekunden, bis das zweite Script ausgeführt wird, wenn ich schnell klicke. Ich denke eher, dass ich irgendwo einen Bock im Code habe.
 
Gibt es denn wenn du es ein baust eine neue Fehlermeldung ?

oder wird der Username gar nicht übertragen ?
 
//EDIT

Habe es herausgefunden.. unter XAMPP in der php.ini Datei waren die Session_cookies nicht erlaubt... nun funktioniert es tadellos

Also..

Ich habe das Formular login.html.. darin gehe ich mit der Post-Methode in das login.php. An allererster Stelle in login.php habe ich:
<?php
session_start();
?>

stehen.. Ich muss das Script wieder schliessen, da danach ziemlich viel HTML - Zeugs kommt.

später öffne ich in login.php wieder das PHP und habe meinen Login-Code. Am Ende habe ich folgendes eingebaut:
Code:
if(isset($_SESSION['username'])) {
$_SESSION["username"] = $username;
echo "Variable wurde gesetzt";
}
else {
$_SESSION["username"] = $username;
echo "Variable wurde nicht gesetzt";
}

Als Antwort wird mir "Variable wurde nicht gesetzt" ausgegeben.. also ist die Variable $_SESSION["username"] gar nicht vorhanden, im Selben Script!

Zur Verdeutlichung hier der komplette Code von login.php:

Code:
<?php
session_start();
?>
<html>
<head>
<title>Login</title>
<meta name="author" content="Andavos">
<meta name="generator" content="Ulli Meybohms HTML EDITOR">
		<link href="css/umfrage_style.css" rel="stylesheet" type="text/css" />
</head>
<body text="#000000" bgcolor="#FFFFFF" link="#FF0000" alink="#FF0000" vlink="#FF0000">


<br><br>



<?php

$username = $_POST["username"];
$passwort = $_POST["password"];
$passwort = md5($passwort);
$log=0;

$userdatei = fopen ("user.txt","r");
while (!feof($userdatei))
   {
   $zeile = fgets($userdatei,500);
   $userdata = explode("|", $zeile);

   if ($userdata[0]==$username and $passwort==trim($userdata[1]))
      {
      $log = 1;
	  //header("location:kategorie.php");
      }
   }
fclose($userdatei);

if ($log==0)
   {
   ECHO "	<p>Zugriff verweigert, Benutzername oder Kennwort falsch</p>
			<a href=\"index.php\">Zur¬&uuml</a>";
   }
 
if(isset($_SESSION['username'])) {
$_SESSION["username"] = $username;
echo "Variable wurde gesetzt";
}
else {
$_SESSION["username"] = $username;
echo "Variable wurde nicht gesetzt";
}

?>
 
Zuletzt bearbeitet:
scheint aber absolut legitim zu sein wenn beim ersten ausführen der datei steht das die variable nicht gesetzt ist,du hast sie vorher ja auch nicht initialisiert, geschweige denn deklariert ;)

wenn beim erneuten aufrufen allerdings die selbe meldung erscheint könnte es sein das die session falsch gespeichert wird.
lass dir doch mal bei jedem aufruf mit session_id() die session ID ausgeben und guck mal ob es die gleichen sind.

bei manchen PHP konfigurationen kann es aber auch sein das $_SESSION['username'] auf ein anderes feld verweißt als $_SESSION["username"], du benutzt beides durcheinander, ich rate dir auf die einzelnen ' umzusteigen, durchgehend.

man könnte das auch einwenig anders machen:

PHP:
if ($log==0)
   {
   ECHO "	<p>Zugriff verweigert, Benutzername oder Kennwort falsch</p>
			<a href=\"index.php\">Zur¬&uuml</a>";
  $_SESSION['username'] = null;
   } else {
 $_SESSION['username'] = $username;
}

dann sollte bei erfolgreichem login die meldung 'Variable gesetzt' erscheinen, bei nicht erfolg dementsprechend die nicht gesetzt meldung
 
Zuletzt bearbeitet:
Ich glaube seine Antwort ist ein wenig untergegangen

//EDIT

Habe es herausgefunden.. unter XAMPP in der php.ini Datei waren die Session_cookies nicht erlaubt... nun funktioniert es tadellos
 
Zurück
Oben