Hilfe beim Session-Management

Ich habe keine Idee, was er damit gemeint haben könnte. Ganz unter uns: Die Klasse ist ******e! Ich weiß nicht, wieviele Leute mit dieser Klasse hier noch ankommen werden. Wo kann man die Vorlage für so nen Müll finden? Wie du vielleicht merkst, bin ich etwas ungehalten über den Zustand, das jemand, der offensichtlich keinen Plan hat, irgendwelche Tipps gibt, wie man es machen kann.

Nur zum Verständnis über Sessions in PHP:

- In jedem Script, das aufgerufen werden kann, in dem Session-Variablen benutzt werden können sollen muss session_start() aufgerufen werden. Das passiert hier, sobald man eine Instanz von der Klasse "kunde" erstellt - im Konstruktor (was für ein Mist!).
- session_start() muss aufgerufen werden, BEVOR jeglicher Inhalt an den Browser gesendet wird. Dazu gehören explizite Ausgaben (z.B. mittels echo, printf, var_dump, etc.) und auch impliziten Ausgaben (z.B. wenn PHP eine Warnung ausgibt, oder einen Fehler oder eine Notiz).

Du kannst deinem Problem evtl. auf die Schliche kommen, wenn du mal

PHP:
error_reporting( E_ALL | E_STRICT );
ini_set( 'display_errors', 1 );

einbaust und zwar NACHDEM die Instanz von der Klasse "kunde" erzeugt wurde - da jeglicher Fehler im Script dafür sorgen würde, das die Session nicht erzeugt werden kann (siehe zweiten Punkt der obigen Erläuterung).

Wenn du mich nach meiner Meinung fragst: Schmeiß das weg und programmier es selbst. Als Vorlage für eigene Ideen ja ganz nett, aber daraus sollte man keine Applikation bauen, die man später evtl. mal verwenden will.

Ich würde zu mindest das session_start() mal aus dem Konstruktor von "kunde" rausnehmen und in den globalen Scope einbauen, am besten in die allererste Zeile des Haupt-Scripts.

Ich habe jetzt mehrere Male über den Ablauf nach gedacht und den Code analysiert, kann aber keinen Workflow feststellen, der sich so äußern würde, dass das Formular angezeigt wird, wenn die Funktion anmelden() erfolgreich durchlaufen wurde.

Entweder wird hier was verschwiegen oder der verwendete Code ist ein anderer als der hier gepostete.

EDIT: Natürlich bin ich nicht ohne Fehler, von daher kann ich auch was übersehen haben. Man möge es mir bitte verzeihen :)
 
Zuletzt bearbeitet:
Wenn du mich nach meiner Meinung fragst: Schmeiß das weg und programmier es selbst. Als Vorlage für eigene Ideen ja ganz nett, aber daraus sollte man keine Applikation bauen, die man später evtl. mal verwenden will.

Ich bin da vollkommen deiner Meinung, leider habe ich bezüglich des Scripts keine Wahl, da es sich um eine Aufgabe fürs Studium handelt (ILS). Leider sind die PHP-Hefte von denen alle so, da werden ojektorientiertes Programmieren mit PHP und Datenbanken auf Knapp 70 Seiten abgehandelt und da soll dann auch noch ein Anfänger durchsteigen, der grade mal seit 2 Monaten damit zu tun hat, wie ich. Ich kann dir sagen, bin tierisch sauer mich für diesen Lehrgang (geprüfter Webdesigner) angemeldet zu haben.

Das Problem ist, dass session_start(); 2 mal vorkommt, einmal soll es in die kundenklasse geschrieben werden und einmal ist es in einer abgeleiteten Klasse einer anderen php-Datei vorhanden. Ich denke ich werde es jetzt mal so belassen, da es offensichtlich an den Vorlagen liegt, die man benutzen soll.
 
Zuletzt bearbeitet:
Das Problem ist, dass session_start(); 2 mal vorkommt, einmal soll es in die kundenklasse geschrieben werden und einmal ist es in einer abgeleiteten Klasse einer anderen php-Datei vorhanden. Ich denke ich werde es jetzt mal so belassen, da es offensichtlich an den Vorlagen liegt, die man benutzen soll.

Naja, zwei mal session_start() ist kein Fehler. Es ist unschön aber kein Fehler, der sich so auswirkt, wie du beschrieben hast. Es wird normalerweise ein Notice geworfen, das der zweite Aufruf ignoriert wird:

Code:
Notice: A session had already been started - ignoring session_start() in D:\web\htdocs\tests\foo.php on line 4

Kannst du mal alles zusammen zippen und hier anhängen? Ich würde es gern mal bei mir testen. So aus dem Kontext heraus habe ich wirklich keine Idee, was es sein könnte.
 
Hier mal das Archiv.

Vielen Dank schonmal für die ganze Mühe, ist ja nicht selbstverständlich :)
 

Anhänge

  • scripte.zip
    196,7 KB · Aufrufe: 142
Zuletzt bearbeitet:
Ok, also:

- Das Kunden-Objekt wird im Konstruktor der Klasse "webshop" erzeugt.
- Innerhalb des Konstruktors der Klasse "sitzungsseite" wird session_start(); gerufen. Das heißt, in "kunde" ist es überflüssig, da "sitzungsseite" von "artikel" beerbt wird, was wiederum von "webshop" beerbt wird.
- Von "webshop" wird eine Instanz im Hauptprogramm erzeugt. Somit wird implizit (durch die ganzen parent::__construct()-Aufrufe) eine Session erzeugt.

Das Einzige, was fehlt, ist der Aufruf von anmelden(), nach dem das Kunden-Objekt im Konstruktor von "webshop" erzeugt wurde. Ich meine das hier:

PHP:
class webshop extends artikel
{
  private $pdf;
  private $kunde;

  public function __construct($dateiname)
  {
    parent::__construct($dateiname);
    
    var_dump($_SESSION);
    
    $this->pdf = new pdf();
    $this->kunde = new kunde();
    if( isset($_POST['bn']) && isset($_POST['pw']) )
    {
    	$this->kunde->anmelden($_POST['bn'], $_POST['pw']);
    }
  }

Da die Funktion anmelden() bereits die Parameter für Benutzername und Passwort beinhaltet, wollen wir diese auch benutzen:

PHP:
  public function anmelden($bn, $pw)
  {
  	if($bn == 'Admin' && $pw == 'Hallo')
  	{
  		$this->KndNr = 1;
  		$_SESSION['id'] = $this->KndNr;
  	}
  }

Damit kannst du dann die von mir zuerst vorgeschlagene Anmelde-Routine aus dem Hauptprogramm entfernen. Außerdem habe ich noch eine Notice im Hauptprogramm korrigiert:

PHP:
  if(!isset($_SESSION['id']) || $_SESSION['id'] != 1) // Function Anmelden

Da ist noch eine isset()-Prüfung reingekommen.

Anbei mein Zip mit der korrigierten Version und ein Diff der geänderten Stellen. Wenn du etwas nicht verstehst, nachfragen kostet nix ;-)
 

Anhänge

  • ea.new.zip
    194 KB · Aufrufe: 291
  • scripte.diff.txt
    2,6 KB · Aufrufe: 242
Ich kann nur sagen, vielen vielen Dank, saftmeister. Ich sitze daran jetzt schon so lange und war total verzweifelt, habe echt kein Land mehr gesehen mit diesen Scripts.
 
Hi,

ich misch mich mal kurz ein, da ich die gleiche Fragestellung in diesem Thread gabe:
http://www.tutorials.de/php/381516-fehler-login-script-finden.html#post1972433

Dodo, du solltest dir im Studienforum den Thread:
"Aufgabenstellung Einsendeaufgabe hier nochmal erklärt"
durchlesen, denn es ist zum Beispiel Teil der Aufgabe ein eigenes Login Script zu schreiben... also nicht das Hauptprogramm zu erweitern, das hatte Partizan auch falsch verstanden.

Also, lieber Saftmeister, wenn du meinem Link, zu meinem Thread, folgen willst und da nochmal Hand anlegen willst hilfst du uns Beiden :D
 
Klar helf ich - bekomm ich dann auch nen Schein? :D

Was meinst du mit "eigenem Login-Script"? Da ist doch schon alles vorhanden, oder täusch ich mich?

Übrigens: Wo kann man das "studieren"? Was kostet das? Wie läuft das ab?
 
Hi,

studieren kann man das hier:
http://www.ils.de/edv-informatik.php
Die Kosten liegen so um die 3500, wenn ich mich richtig erinnere.

Normaler Weise komme ich auch ohne Hilfe klar, aber diesmal ist es so, dass auch die anderen Teilnehmer im Studienforum schreiben, dass die Aufgaben ungewöhnlich schwierig
sind, das heißt, dass das Thema nicht gut erklärt wurde.

Mit eigenem Login Script meinte ich eine eigene Klasse also eine eigene PHP-Datei.

Meine Version funktioniert leider gar nicht.

Es ist auch Teil der Aufgabe, dass die Kundennummer mit der Methode „getKundennummer()“ bei der if Abfrage im Login übernommen werden soll und die Session Id muss gar nicht überschrieben werden … ich glaube, dass wurde hier gemacht
 
Ohwe, meine Freundin macht auch gerade ein Fernstudium bei der ILS zur Webdesignerin und hat die Hefte für PHP bekommen. Ich hab nur mal kurz reingesehn und hab gleich zum jaulen angefangen....
Da kann man nur den Kopf schüttlen was die einem bieten. Zur Grundlagen erlernung isses vielleicht nicht schlecht, aber dann sollte es zumindest richtig sein.
 
Zurück