Klasse erweitern. Bitte Hilfe ******

didou

Grünschnabel
Hallo,

erstmal ein Lob an den Machern und Mitgliedern dieses Forums ;)

Jetzt zu meinem Anliegen. Ich habe eine Klasse die ich erweitern muss, nur ich komme da nicht weiter. Entweder ich bin zu blöd dafür oder die Aufgabe so unlogsich ist.

Hier ist die Klasse (Es ist nur eine Klasse von mehreren):
PHP:
<?php

class kunde
{
  private $KndNr;
  public function __construct() 
  {
    $this->KndNr = time();
  }
  public function getKundenNummer()
  {
    return $this->KndNr;
  }
}
?>

Nun diese Klasse muss so erweitert werden:
1. es soll eine Methode integriert werden, die einen benutzer und Passwort entgegennimmt. Falls es "Admin" / "admin" ist, soll die $KndNr = 1 sein, für alle anderen Kombinationen $KndNr = Zeitstempel.
2. Der Konstructor und Destructor der Klasse sollen erweitert werden zum Lesen und Setzen der SESSION['id'], wo die KndNr abgelegt werden soll.

Ich habe es so gelöst.

PHP:
<?php
class kunde
{
  private $KndNr;
  private $benutzer = "Admin";
  private $kennwort = "Halo";
  
  public function __construct()  // Der Konstructor
  {
    if (!isset ($_SESSION['id'])) // Es wird erst geprüft ob eine Session existiert
    {
      $_SESSION['id'] = $this->KndNr; // Falls nicht wird darin der Unix-ZeitStempel abgelegt
    }
    else
    $_SESSION['id'] = $_SESSION['id']; //Falls eine existiert wird sie weiter benutzt
  }

  public function anmelden()  // Die Methode anmelden
  {
    if ($this->benutzer == "Admin" && $this->kennwort == "admin")
    {
      $this->KndNr = 1;  // KndNr ist 1 falls die Kombination stimmt.
    }
    else  // hier habe ich meine Zweifell :D
    {
      if (!isset ($_SESSION['id']))
      {
      $this->KndNr = time(); 
      }
      else
      {
        $this->KndNr = $_SESSION['id'];
      }
    }
//    $_SESSION['id'] = $this->KndNr; 
  }

  public function __destruct()  // im Destructor wird die KndNr in der SESSION abgespeichert
  {
    $_SESSION['id'] = $this->KndNr;
    print $_SESSION['id'];  //Kontrollausgabe
  }

  public function getKundenNummer()
  {
    return $this->KndNr;
  }
}
?>

aso, und der Unix-Zeitstempel soll nur beim ersten Durchlauf gespeichert werden, sonst ändert sich die KndNr bei jedem Aufruf der Seite.

Wie findet ihr die Lösung und sind da irgendwelche Gedankenfehler**** :)
Ich hatte erst eine if-Anfrage gehabt, wo der Admin keine Möglichkeit hätte sich anzumelden.


Es sind noch 2 Fragen zu der Aufgabe die mir von der Reihenfolge her unlogisch scheinen, aber ich wollte erst Etappenweise arbeiten, sonst komme ich ganz durcheinander. :confused:

Als Vorschau:

3. Es soll eine Seite erstellt werden mit einem Anmeldeformular, (Wo ich finde: man soll erst eine Anmeldeseite erstellen dann die anmelde Methode, oder sehe ich das falsch). durch diese Seite landet der Admin in einem Bereich und die anderen User wo anders.

4. Da soll der Adminbereich erstellt werden aber da bin ich schon weiter.
 
item: Problem. Im Constructor schriebst du
PHP:
if (!isset ($_SESSION['id'])){ // Es wird erst geprüft ob eine Session existiert 
      $_SESSION['id'] = $this->KndNr; // Falls nicht wird darin der Unix-ZeitStempel abgelegt
    }...
Zu diesem Zeitpunkt ist $this->KndNr leer.
Du willst es sicher umgekehrt
PHP:
$this->KndNr = $_SESSION['id'];

item: Du bist immer als admin mit falschem Passwort angemeldet
PHP:
  private $benutzer = "Admin";
  private $kennwort = "Halo";
...
  public function anmelden(){  // Die Methode anmelden
    if ($this->benutzer == "Admin" && $this->kennwort == "admin")
...
Du setzt benutzer und kennwort nirgens, sondern vergleichst 2 feste Werte, wobei diese beim Passwort unterschiedlich sind
Du solltest den Benutzer und das Kennwort von aussen übernehmen
PHP:
  public function anmelden($benutzer, $kennwort){
      if($this->benutzer == $benutzer && $this->kennwort == $kennwort){
...
Dann kannst du es von Aussen mitgeben
PHP:
$kunde = neu kunde();
$kunde->anmelden($benutzerAusFormular, $kennwortAusFormular);


Nachtrag:
So würde meine Umsetzung aussehen
PHP:
class Kunde{
  const C_ADMIN_USER = 'Admin';
  const C_ADMIN_PWD = 'admin';
  private $KndNr;
  
  public function __construct(){
    //Kürzere Form für ein if...else zum Setzen eines Wertes
    $this->KndNr = (isset($_SESSION['id'])) ?  $_SESSION['id'] : time();
  }
  
  public function anmelden($user, $pwd){
      if(self::C_ADMIN_USER == $user && self::C_ADMIN_PWD == $pwd){
          $this->$KndNr = 1;
      }
      // Fallse der User nicht admin ist, muss nix geändert werden. die $_SESSION['id'] wurde bereits im Konstruktor übernommen
  }
  
  public function getKundenNummer(){
    return $this->KndNr;
  }
  
  public function __destruct(){
      $_SESSION['id'] = $this->KndNr;
  }
}

Nachtrag II:
Wo ich finde: man soll erst eine Anmeldeseite erstellen dann die anmelde Methode, oder sehe ich das falsch
Nope. Zuerst die Funktionalität. Die Seiten dazu sind nachher pipifax.Die Seiten dazu kann eigentlich auch jemand machen der keine Ahnung vom Programmieren hat....
 
Nope. Zuerst die Funktionalität. Die Seiten dazu sind nachher pipifax.Die Seiten dazu kann eigentlich auch jemand machen der keine Ahnung vom Programmieren hat....

Ich will jetzt keine Diskussion lostreten, aber ich arbeite immer so. Aber das bleibt jedem selbst überlassen, oder besser gesagt dem Projektleiter.
Extreme Prototyping as a development process is used especially for developing web applications. Basically, it breaks down web development into three phases, each one based on the preceding one. The first phase is a static prototype that consists mainly of HTML pages. In the second phase, the screens are programmed and fully functional using a simulated services layer. In the third phase the services are implemented. The process is called Extreme Prototyping to draw attention to the second phase of the process, where a fully functional UI is developed with very little regard to the services other than their contract.
http://en.wikipedia.org/wiki/Software_prototyping#Extreme_prototyping

Wenn er zuerst die Oberfläche gemacht hat, wäre er jetzt bei Teil zwei. Ein Funktions-Layer, der die spätere Funktionalität immitiert, um die Oberfläche komplett Funktionsfähig zu haben. Im dritten Schritt würde die Klasse dann geändert werden, um z.B. mit einer Datenbank verbunden zu werden, damit man sich tatsächlich mit einem Konto anmelden kann.
 
Danke erstmal für die schnelle Antworten.

Du bist immer als admin mit falschem Passwort angemeldet

Ich habe diese Werte manuel geändert, weil ich noch keine Anmeldeformular habe. Deswegen war meine Logik erst das Formular dann die Funktionen. Dann kann ich auch testen. So musste ich die 2 Variablen so anmelden und dann ändern.

Du setzt benutzer und kennwort nirgens, sondern vergleichst 2 feste Werte, wobei diese beim Passwort unterschiedlich sind
Du solltest den Benutzer und das Kennwort von aussen übernehmen

Das wäre mein nächster Schritt gewesen. Aber Ihr habt mir ja schon ein ganzes Stück geholfen.
 
Zuletzt bearbeitet:
Hallo nochmal,

es geht weiter mit meinem Problem.

ich bin jetzt fertig oder fast fertig mit dem Code. Das einzige Problem ist,
es wird eine Seite angezeigt, unten ist ein Admin-anmeldebereich, was nur angezeigt wird wenn der Admin nicht angemeldet ist. Wenn der Admin sich anmeldet mit "Admin"/"admin", soll dieses Formular verschwinden und eine andere Seite angezeigt werden. Soweit so gut. Mein Problem, wenn der Admin sich anmeldet, bleibt das Formular da, erst nach aktualisieren der Seite, macht es was ich will.

PHP:
<?php

...

else
{
  if(!empty($_REQUEST['id']))
  {
    $art->waehlen($_REQUEST['id']);
  }
  $art->inhalt($text[0]);
  $art->anzeigen();
  $art->inhalt($text[1]);
  if($_SESSION['id'] != 1)  // Wenn User nicht Admin ist. Die Variable bekommt 
                            //den Wert 1 nur wenn der admin angemeldet ist.
  {
    $art->inhalt($text[5]); // Das Array text[5] enthält HTML Code für ein Anmelde Formular
  }
  else
  {
    $art->inhalt($text[6]); // Das Array text[6] enthält HTML Code für Admin Bereich
  } 
}

...

?>

Wie kann ich es lösen? oder übersehe ich da was?

Danke
 
Hallo ihr Lieben,

mich würde interessieren wie ein Anmeldeformular aussehen müsste, damit Benutzername + Passwort übernommen wird für die weitere Benutzung innerhalb des "Webshops"...

PHP:
$text[5][0]="<form action=\"seite.php\" method=\"post\">
<p><input name=\"username\" /> Name </p>
<p><input type=\"password\" name=\"pw\" /> Passwort</p>
<p><input type=\"submit\" value=\"Login\" /></p>
</form>";

seite.php wäre ja in diesem Fall z.b. nicht richtig, weil die Funktionen ja in der class_kunden.php liegen oder doch (angenommen seite.php ist die Hauptseite des Shops)

Gruß
 
Wenn jemand dein Formular von oben ausfüllt und absendet, stehen die Daten dann den super globalen $_POST und $_REQUEST.

Aber erstelle doch für dein Problem einen neuen Thread.
 
Entschuldige,

dachte es wäre angebrachter hier mich dran zu hängen, da es quasi um das selbe Script geht.

Werde nochmal ein anderes Thema erstellen in Kürze und etwas ausführlicher schreiben dann :-)

Danke
 
Zurück