Hilfe beim Session-Management

Wie saftmeister beschrieben hat
$_SESSION['id'] = 1 ist nicht $_SESSION['id'] == 1


Hab mich missverständlich ausgedrückt,
habe dieses Script:


PHP:
 if($_SESSION['id'] != 1)   
  {
    $art->inhalt($text[5]); // Anmeldeformular
  }
  else
  {
    $art->inhalt($text[6]); // Admin-Bereich
  }

und diese Funktion

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

Stehe aber vor dem Selben Problem, dass wenn ich mich übers Formular anmelde, ich nicht in den Amdin-Bereich komme.
 
Wo wird die Funktion "anmelden" in deinem Source-Code aufgerufen? Wie sieht dein Login-Formular aus? Du prüfst in deiner Funktion nicht die Parameter die an die Funktion übergeben wurden, sondern gegen statische Strings - hast du das beim testen berücksichtigt?
 
Wo wird die Funktion "anmelden" in deinem Source-Code aufgerufen? Wie sieht dein Login-Formular aus? Du prüfst in deiner Funktion nicht die Parameter die an die Funktion übergeben wurden, sondern gegen statische Strings - hast du das beim testen berücksichtigt?


Also hier mal das komplette Hauptprogramm

PHP:
<?php
require_once("class_webshop04.php");
require_once("texte04.php");
require_once("class_kunde.php");

$art = new webshop("artikeldaten.xml");
if(isset($_REQUEST['pdf']))
{
  $art->pdfliste();
}
$art->setTitel("Webshop 03");
$art->kopf();

if(isset($_REQUEST['wk']))
{
  $art->inhalt($text[3]);
  $art->auswahl();
  $art->inhalt($text[2]);
}
elseif(isset($_REQUEST['order']))
{
  $art->bestellen($art->getKundenNummer());
  $art->inhalt($text[4]);
}
else
{
  if(!empty($_REQUEST['id']))
  {
    $art->waehlen($_REQUEST['id']);
  }
  $art->inhalt($text[0]);
  $art->anzeigen();
  $art->inhalt($text[1]);
  if($_SESSION['id'] != 1) // Function Anmelden
  {
    $art->inhalt($text[5]);
    print "Sie sind als Kunde eingeloggt<br />";
  }
  else
  {
    $art->inhalt($text[6]);
  }
}
$art->fuss();
?>


Das Formular wird aus einer PHP-Datei generiert, in der ich auch die anderen Texte speichere

PHP:
$text[5][0]="<form action=\"programm46.php\" method=\"post\"> 
<p><input name=\"bn\" /> Name </p> 
<p><input type=\"password\" name=\"pw\" /> Passwort</p> 
<p><input type=\"submit\" value=\"Login\" /></p> 
</form>";
$text[6][0]="<html><body><p><h1>Admin-Bereich</p></body></html>";

und hier die class_kunde.php, da steht die Funktion anmelden

PHP:
<?php
class kunde
{
  private $KndNr;
  private $bn = "Admin";
  private $pw = "Hallo";

  public function __construct()
  {
	  session_start();
    $this->KndNr = (isset($_SESSION['id'])) ? $_SESSION['id'] : time();
  }
  
  public function anmelden($bn, $pw)
	{
    if($_POST['bn'] == 'Admin' && $_POST['pw'] == 'Hallo')
	  {
      $this->KndNr = 1;
    }
	}
	
public function getKundenNummer() 
    { 
        return $this->KndNr; 
    } 
     
    public function __destruct() 
    { 
      $_SESSION['id'] = $this->KndNr;
    }
}

?>

Vielleicht ist es jetzt im Zusammenhang ersichtlicher.
Ich glaube, dass es daran liegt, dass ich die Funktion im Hauptprogramm falsch aufrufe, aber kann mich natürlich auch irren.
 
Hmm, soweit ich das richtig sehe, wird die Funktion überhaupt nicht aufgerufen. Und das ist vmtl. auch das Problem des Thread-Erstellers. Ich würde mal so vorgehen (ohne Garantie): Unterhalb von require_once("class_kunde.php"); baut man folgende Zeilen ein:

PHP:
require_once("class_kunde.php"); 

// Prüfen, ob ein Login stattgefunden hat
$kunde = new kunde();

if( isset( $_POST['bn'] ) && isset( $_POST['pw'] ) )
{
  $kunde->anmelden( $_POST['bn'], $_POST['pw'] );
}
 
Hmm, soweit ich das richtig sehe, wird die Funktion überhaupt nicht aufgerufen. Und das ist vmtl. auch das Problem des Thread-Erstellers. Ich würde mal so vorgehen (ohne Garantie): Unterhalb von require_once("class_kunde.php"); baut man folgende Zeilen ein:

PHP:
require_once("class_kunde.php"); 

// Prüfen, ob ein Login stattgefunden hat
$kunde = new kunde();

if( isset( $_POST['bn'] ) && isset( $_POST['pw'] ) )
{
  $kunde->anmelden( $_POST['bn'], $_POST['pw'] );
}


So jetzt scheint es schon mal zu funktionieren (wenn ich die Zugangsdaten ins Formular eingebe kommt zwar erstmal nochmal das Formular, aber wenn ich dann aktualisiere erscheint der Admin-Bereich)
Denke das Problem war, dass im Hauptprogramm vorher kein Objekt der Kundenklasse vorhanden war. Könnte das Problem, dass nach dem Anmelden trotzdem nochmal das Formular kommt (anstatt sofort in den Admin-Bereich zu gehen) mit fehlenden isset-Abfragen zu tun haben oder woran könnte es liegen?
 
Es könnte daran liegen, das $_SESSION['id'] erst beim vernichten des Objekts $kunde gesetzt wird. Das passiert natürlich erst, wenn das PHP-Script vollständig abgearbeitet und beendet wird. Du kannst das umgehen, wenn du in der anmelden()-Funktion beim erfolgreichen Login $_SESSION['id'] sofort auf 1 setzt:

PHP:
    public function anmelden($bn, $pw)
    {
      if($_POST['bn'] == 'Admin' && $_POST['pw'] == 'Hallo')
      {
        $this->KndNr = 1;
      }
      $_SESSION['id'] = $this->KndNr;
    }
 
Hab die Funktion mal so erweitert wie oben beschrieben, der Fehler tritt immer noch auf, eigenartig...
Hier hatte ja noch jemand wie ich das Problem

http://www.tutorials.de/php/380187-klasse-erweitern-bitte-hilfe.html

Der Threadersteller hats scheinbar hinbekommen,
er meinte:

Hat sich erledigt, ich musste $_SESSION['id'] durch eine get-function ersetzen.

Was meinte er damit und wo müsste ich dann $_SESSION['id'] in eine get-Funktion ersetzen? Bei der Funktion anmelden oder wo?
 
Zuletzt bearbeitet:
Zurück