Announcement

Collapse
No announcement yet.

Problem mit Konstruktor in eienr PHP Klasse

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Problem mit Konstruktor in eienr PHP Klasse

    Hallo Zusammen,

    ich finde für folgendes Problem einfach nicht den Fehler:

    Meine Klasse:

    PHP Code:
    class Artikel extends DB
    {
        protected 
    $titel;

        public function 
    Artikel($artikel_nr){
            
    $lange          $_SESSION['lange']; // Sprache holen
            
    $spalte_lange   "b.artikel_titel_".$lange;
            
    $sql_artikel    "select $spalte_lange as titel, a.artikel_nr from dbo_artikel a, dbo_artikel_titel b where a.artikel_nr = b.artikel_nr and a.artikel_nr = '$artikel_nr'";
            
    $res_artikel    $this->mysqli->query($sql_artikel);
            
    $a_artikel      $res_artikel->fetch_object();
            
    $this->titel    $a_artikel->titel;
        }

        public function 
    showArtikelTitel(){
            echo 
    $this->titel;
        }

    Ausgabe aus der Seite:

    PHP Code:
    $Artikel = NEW Artikel($artikel_nr);
    echo 
    $Artikel->showArtikelTitel(); 
    bringt die Fehlermeldung:

    Fatal error: Call to a member function query() on a non-object in /home/www/....

    Wenn ich die Funktion Artikel($artikel_nr) nicht als Konstruktor definiere und umbenenne in Artikel_($artikel_nr) und so aufrufe

    PHP Code:
    $Artikel = NEW Artikel();
    $Artikel->Artikel_($artikel_nr);
    echo 
    $Artikel->showArtikelTitel(); 
    funktioniert es. Warum geht es nicht wenn ich die Funktion als Konstruktor aufrufe?

    Gruß René

  • #2
    function __construct($artikel_nr)
    http://php.lernenhoch2.de/lernen/php...nitialisieren/
    Christian

    Comment


    • #3
      Hallo,
      Originally posted by Nevada208 View Post
      ...Warum geht es nicht wenn ich die Funktion als Konstruktor aufrufe?
      Weil du in deinem Konstruktor etwas wichtiges vergessen hast! Es fehlt der Aufruf des Konstruktors der Elternklasse, in der sicherlich auch die Eigenschaft $this->mysqli initialisiert wird.
      PHP Code:
      class Artikel extends DB
      {
          protected 
      $titel;

          public function 
      Artikel($artikel_nr){
              
      parent::DB();
              
      $lange          $_SESSION['lange']; // Sprache holen
              
      $spalte_lange   "b.artikel_titel_".$lange;
              ... 
      oder besser:
      PHP Code:
      class Artikel extends DB
      {
          protected 
      $titel;

          public function 
      __construct($artikel_nr){
              
      parent::__construct();
              
      $lange          $_SESSION['lange']; // Sprache holen
              
      $spalte_lange   "b.artikel_titel_".$lange;
              ... 
      Gruß Falk

      Anmerkung: Ich halte es für keine gute Idee eine Artikelklasse von einer Datenbankklasse abzuerben.
      Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

      Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

      Comment


      • #4
        Hallo Falk,

        Originally posted by Falk Prüfer View Post

        Anmerkung: Ich halte es für keine gute Idee eine Artikelklasse von einer Datenbankklasse abzuerben.
        wie macht man es richtig?

        Gruß René

        Comment


        • #5
          Hallo,
          Originally posted by Nevada208 View Post
          ...wie macht man es richtig?
          Datenbankklassen sind meist nach dem Single-Instance- oder Singleton-Pattern angelegt. Für einen Artikel ist das denkbar ungünstig, da hier durchaus die gleichzeitige Existenz mehrerer Instanzen denkbar ist. Erstelle also eine einfache Artikelklasse oder erbe sie von einer einfachen Basis-Objekt-Klasse ab und gib ihr eine Eigenschaft für die DB-Instanz. Ich kenne jetzt die konkret von dir verwendete DB-Klasse nicht, aber sollte es sich um ein Singleton handeln, dann wäre sowas denkbar:
          PHP Code:
          <?php

          class DBObject
          {
            protected 
          $db null;

            public function 
          __construct()
            {
              
          $this->db DB::getInstance();
            }
          }

          class 
          Artikel extends DBObject
          {
            protected 
          $titel;

            public function 
          __construct($artikel_nr)
            {
              
          parent::__construct();
              
          $lange          $_SESSION['lange']; // Sprache holen
              
          $spalte_lange   "b.artikel_titel_".$lange;  // Hier sollte unbedingt noch eine Maskierung erfolgen!!!
              
          $sql_artikel    =
               
          "select $spalte_lange as titel, a.artikel_nr
                from dbo_artikel a, dbo_artikel_titel b
                where a.artikel_nr = b.artikel_nr and a.artikel_nr = '
          $artikel_nr'"// Hier sollte unbedingt noch eine Maskierung erfolgen!!!
              
          $res_artikel    $this->db->mysqli->query($sql_artikel);
              ...
            }
            ...
          }

          ?>
          Ist neben der Artikel-Klasse keine weitere Klasse mit DB-Zugriff geplant, so kann man natürlich auch auf die DBObject-Klasse verzichten und die Eigenschaft $db direkt in die Artikel-Klasse packen.

          Gruß Falk
          Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

          Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

          Comment


          • #6
            Hallo Falk,

            danke für Deine Antwort. Was meinst Du mit Maskierung?

            Gruß René

            Comment


            • #7
              Originally posted by Nevada208 View Post
              Was meinst Du mit Maskierung?
              ==> http://de.wikipedia.org/wiki/SQL-Injection
              Wenn du denkst du hast alle Bugs gefunden, dann ist das ein Bug in deiner Denksoftware.

              Quellcode ohne ein Mindestmaß an Formatierung sehe ich mir nicht an! Ich leiste keinen Privatsupport per Mail oder PN!

              Comment


              • #8
                Hallo Falk, danke für die Info.

                Comment

                Working...
                X