Ankündigung

Einklappen
Keine Ankündigung bisher.

private Methoden

Einklappen

Neue Werbung 2019

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • private Methoden

    Hallo zusammen

    Bin momentan in einem Kurs zur Webdesignerin und stecke bei einer PHP Aufgabe fest.

    Die Aufgabe lautet:
    Erstellen Sie eine SQL-Abfrage zum Löschen aller Einträge in der Tabelle "ws_warenkorb", die älter als 14 Tage sind. Die Abfrage soll Teil einer privaten Methode sein. (a) wie könnte eine entsprechende Methode genannt werden? warenkorbLeeren habs ich genannt / b) Aus welcher anderen Methode sollte dies neue, private Methode aufgerufen werden? Dachte mir unter der public function auswahl($kunde) in class_webshop.php / c)In welcher Klasse sollte die Methode implementiert werden wg. des Sinnzusammenhangs? Dachte eben in class_webshop.php

    Dazu haben wir verschiedene Klassen erzeugt. In der Klasse class_kunde.php hab ich folgendes eingefügt:


    private function warenkorbLeeren()
    {
    $sql = "DELETE FROM ws_warenkorb WHERE DATEDIFF (NOW(), w_timestamp) >= 14";
    $this->dbh->query($sql);
    }
    dies wollte ich dann in der class_webshop.php unter der public function auswahl($kunde) auführen

    public function auswahl($kunde) # zeigt ausgewählte Artikel
    {
    $this->kunde->warenkorbLeeren();
    $sql = "SELECT a_datum AS a_konzerttermin, a_name AS a_veranstaltung, w_menge, a_preis FROM ws_warenkorb, ws_artikel WHERE w_kunde = $kunde AND w_artikelnr = a_artikelnr";
    $result = $this->dbh->query($sql);
    $tmp = $result->fetchAll(PDO::FETCH_ASSOC);
    if (count($tmp) > 0)
    {
    print "<table align='center'>\n";
    print " <tr>\n <th>Konzerttermin</th><th>Veranstaltung</th><th>Kartenanzahl</th><th>Preis</th>\n</tr>\n";
    foreach($tmp as $key)
    {
    print " <tr>\n";
    print " <td>".$key['a_konzerttermin']."</td><td>".$key['a_veranstaltung']."<td>".$key['w_menge']."</td><td>".$key['a_preis']."</td>\n";
    print " </tr>\n";
    }
    print "</table>\n";
    }
    else
    print "Keine Artikel im Warenkorb gefunden.";
    }
    doch dann kommt folgende Fehlermeldung:

    Fatal error: Call to private method kunde::warenkorbLeeren() from context 'webshop' in /var/www/vhosts/r2it.de/becca.r2it.de/PHP03-03/class_webshop.php on line 25

    Kann mir da bitte wer von euch weiterhelfen? Wäre echt super

  • #2
    Habt ihr Sichtbarkeit schon besprochen? Private Methoden können nur innerhalb derselben Klasse aufgerufen werden.

    Kommentar


    • #3
      Du versuchst von außen / außerhalb der Klasse die Funktion warenkorbLeeren(), die private ist, aufzurufen. Dieses funktioniert nicht. Du kannst nur public deklarierte funktionen / variablen von außen aufrufen.

      Beispiel:
      PHP-Code:
      class Warenkorb {
               private function 
      _leereWarenkorb() {
                   .............
                   return 
      true;
              }

            public function 
      leereWarenkorb() {
                      return 
      $this->_leereWarenkorb();
            }
      }

      class 
      User {
          protected 
      $warenkorb = new Warenkorb();

          public function 
      leereWarenkob() {
                    
      $successfull $warenkorb->leereWarenkorb();
          }

      Eine persönlich Anmerkung. Trenne HTML von der Business-Logik.

      Kommentar


      • #4
        Vielen Dank für die Hilfe nur im Kurs ist es erstmal so vorgegeben, dies so zu machen gemischt mit HTML. Später werd ich es sicher mal so machen.

        Also wenn ich dich richtig verstanden habe Abo, dann kann private function gar nicht in der anderen Seite class_webshop aufgerufen werden. Nur dann wenn diese function auf public umgestellt ist?
        Hmm dann stimmt ja die Aufgabenstellung von der Studienplattform gar nicht, denn die verlangen ja eigentlich ne private Methode(private function). Hmmm

        @ Tropi ja die Sichtbarkeit haben wir schon durch, doch ich dachte wenn das verlangt wird , dann funktioniert das auch. Aber denke nun dass die Aufgabenstellung verkehrt ist, wenn das mit private gar nicht geht!

        LG

        Kommentar


        • #5
          In der Aufgabenstellung steht nur, dass die SQL-Query über ein private aufgerufen werden soll.
          Den Aufruf der private kannst Du ( und musst Du auch ) über eine public machen.

          Unterschied zu protected und private ist übrigens der, dass private Member nicht vererbt werden, protected hingegen schon.

          Kommentar


          • #6
            Zitat von blackybaby Beitrag anzeigen
            Vielen Dank für die Hilfe nur im Kurs ist es erstmal so vorgegeben, dies so zu machen gemischt mit HTML. Später werd ich es sicher mal so machen.

            Also wenn ich dich richtig verstanden habe Abo, dann kann private function gar nicht in der anderen Seite class_webshop aufgerufen werden. Nur dann wenn diese function auf public umgestellt ist?
            Hmm dann stimmt ja die Aufgabenstellung von der Studienplattform gar nicht, denn die verlangen ja eigentlich ne private Methode(private function). Hmmm

            @ Tropi ja die Sichtbarkeit haben wir schon durch, doch ich dachte wenn das verlangt wird , dann funktioniert das auch. Aber denke nun dass die Aufgabenstellung verkehrt ist, wenn das mit private gar nicht geht!

            LG
            Das ist korrekt. Ansonsten kann ich mich nur Arne anschliessen.

            Kommentar


            • #7
              Vielen vielen Dank für eure Hilfe, habt mir sehr weitergeholfen.

              Kommentar


              • #8
                Wenn Du die Private methode wirklich so nutzen sollst (ich bezweifle das allerdings) und beeindrucken willst rufe die private methode über Reflection auf.

                Kommentar


                • #9
                  Hallo Ihr Lieben, da ihr mir so super geholfen habt, hätte ich da noch eine Aufgabe aus diesem Kurs. Danach bin ich endgültig damit durch!

                  Die Aufgabenstellung lautet folgendermassen: Ändern Sie die Klassen "artikel" und "webshop" so ab, dass die Liste der lieferbaren Artikel nicht mehr dem $artikelArray" entnommen werden, sondern direkt per Datenbankabfrage in der Methode "webshop::anzeigen()" geholt und ausgegeben wird. Hoffe ihr könnt mir das eine mal noch helfen, wär ich euch wirklich sehr dankbar

                  Füge die beiden Codes noch ein für euch:

                  hier class_artikel

                  PHP-Code:
                  <?php
                  error_reporting
                  (E_ALL);
                  ini_set('display_errors''1');
                  require_once (
                  "class_sitzungsSeite.php");
                  require_once (
                  "class_seite.php");

                  class 
                  artikel extends sitzungsSeite
                  {
                  protected 
                  $artikelArray = array();

                      private 
                  $DB = array('database' => '''user' => '''password' => '');
                      protected 
                  $dbh#Database-Handle


                      
                  public function __construct()
                  {
                  parent::__construct();
                  if(!
                  is_array($this->DB) && empty($this->DB['database']))
                  throw new 
                  Exception("Daten fuer Datenbankverbindung fehlen!");
                  else
                  {
                  $connectString "mysql:dbname=".$this->DB['database'].
                  ";host=localhost:3306";
                  try
                  {
                  $this->dbh = new PDO($connectString$this->DB['user'],
                  $this->DB['password'] );
                  $this->dbh->setAttribute(PDO::ATTR_ERRMODE,
                  PDO::ERRMODE_EXCEPTION);
                  $sql "SELECT a_datum AS a_konzerttermin, a_artikelnr, a_name AS a_veranstaltung, a_menge AS a_kartenvorrat, a_preis
                  FROM ws_artikel
                    WHERE a_menge > 0"
                  ;

                  $result $this->dbh->query($sql);
                  $tmp $result->fetchAll(PDO::FETCH_ASSOC);
                  foreach (
                  $tmp as $key => $value)
                  {
                  foreach(
                  $value as $ky => $val)
                  {
                  $name explode("_"$ky);
                  if (
                  $ky != 'a_artikelnr')
                  $this->artikelArray[$value['a_artikelnr'] ][$name[1]]
                  $val;
                  }
                  }
                  }
                  catch(
                  PDOException $e)
                  {
                  echo 
                  $e->getMessage();
                              }
                          }
                      }


                      public function 
                  anzeigen()
                      {

                          
                  $sql "SELECT a_date AS a_konzerttermin, a_name AS a_veranstaltung, a_menge AS a_kartenvorrat, a_preis FROM ws_artikel WHERE a_kartenvorrat > 0";
                          
                  $result $this->dbh->query($sql);
                          
                  $tmp $result->fetchAll(PDO::FETCH_ASSOC);
                          foreach (
                  $tmp as $key => $value)
                          {
                           echo 
                  "Datensatz ".$key." und Werte ArtikelNr :".$value['a_artikelnr']." | ".$value['a_konzerttermin']." ";
                          }

                          }


                      public function 
                  waehlen($artikelnummer$kunde=1)
                      {
                          if(!empty(
                  $artikelnummer) && !empty($kunde))
                          {
                              try
                              {
                                  
                  $sql "UPDATE ws_warenkorb SET w_menge = w_menge +1 WHERE w_artikelnr = :nummer AND w_kunde = :kunde";
                                  
                  $result $this->dbh->prepare($sql);
                                  
                  $result->bindParam(':nummer'$artikelnummerPDO::PARAM_INT);
                                  
                  $result->bindParam(':kunde'$kundePDO::PARAM_INT);
                                  
                  $result->execute();
                                  if(
                  $result->rowCount() == 1)
                                      return 
                  true;

                                          
                  $sql "INSERT INTO ws_warenkorb(w_artikelnr, w_kunde, w_menge) VALUES (:nummer, :kunde, 1)";

                                      
                  $result $this->dbh->prepare($sql);
                                      
                  $result->bindParam(':nummer'$artikelnummerPDO::PARAM_INT);
                                      
                  $result->bindParam(':kunde'$kundePDO::PARAM_INT);
                                      
                  $result->execute();
                                      if(
                  $result->rowCount() == 1)
                                      {
                                          print 
                  "Datensatz wurde eingetragen!";
                                          return 
                  true;
                                      }
                                  return 
                  false;
                              }
                              catch(
                  PDOException $e)
                              {
                                  echo 
                  $e->getMessage();
                              }
                          }
                      }








                      public function 
                  bestellen($kunde)
                  {
                  if(!
                  is_integer($kunde)) # Gültigen Kundennummer?
                  throw new Exception('Keine Kundennummer'); # Fehler ausgeben
                  else
                  {
                  try
                  {
                  #in Datenbank schreiben
                  $sql  "SELECT w_kunde, w_artikelnr, w_menge
                  FROM ws_warenkorb
                  WHERE w_kunde = :kunde"
                  ;
                  $result $this->dbh->prepare($sql);
                  $result->bindParam(':kunde'$kundePDO::PARAM_INT);
                  $result->execute();
                  $tmp $result->fetchAll(PDO::FETCH_ASSOC);
                  foreach(
                  $tmp as $key => $value)
                  {
                  $sql "INSERT INTO ws_bestellung (b_kunde,
                  b_artikelnr,
                  b_menge)
                  VALUES (:kunde, :artikel, :menge)"
                  ;
                  $result $this->dbh->prepare($sql);
                  $result->execute(array(':kunde' => (int)$value['w_kunde'],
                  ':artikel' =>(int)$value['w_artikelnr'],
                  ':menge' => $value['w_menge']));
                  if(
                  $result->rowCount() == 1)
                  {
                  $sql1 "UPDATE ws_artikel
                  SET a_menge = a_menge - :anzahl
                  WHERE a_artikelnr = :artikel"
                  ;
                  $result1 $this->dbh->prepare($sql1);
                  $result1->bindParam(':anzahl'$value ['w_menge'],
                  PDO::PARAM_INT);
                  $result1->bindParam(':artikel'$value ['w_artikelnr']);
                  $result1->execute();
                  if (
                  $result1->rowCount() == 1)
                  {
                  $sql2 "DELETE FROM ws_warenkorb
                  WHERE w_kunde = :kunde
                  AND w_artikelnr = :artikel"
                  ;
                  $sth2 $this->dbh->prepare($sql2);
                  $sth2->execute(array(':kunde' => (int)$kunde,
                  ':artikel' => (int)$value['w_artikelnr']));
                  }
                  $error true;
                  }
                  }
                  }
                      catch(
                  PDOException $e)
                  {
                  echo 
                  $e->getMessage();
                  }
                  }
                  session_destroy();
                  return 
                  $error;
                  }

                  }

                  ?>
                  und hier noch class_webshop


                  PHP-Code:
                  <?php
                  error_reporting
                  (E_ALL);
                  ini_set('display_errors''1');
                  require_once (
                  "class_artikel.php");
                  require_once (
                  "class_pdf.php");
                  require_once (
                  "class_kunde.php");
                  require_once (
                  "texte.php");


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


                      public function 
                  __construct()
                      {
                          
                  parent::__construct();
                          
                  $this->pdf = new pdf;
                          
                  $this->kunde = new kunde($this->dbh);
                      }

                      public function 
                  auswahl($kunde# zeigt ausgewählte Artikel    
                      
                  {
                          
                  $this->kunde->warenkorbLeeren();
                          
                  $sql "SELECT a_datum AS a_konzerttermin, a_name AS a_veranstaltung, w_menge, a_preis FROM ws_warenkorb, ws_artikel WHERE w_kunde = $kunde AND w_artikelnr = a_artikelnr";
                          
                  $result $this->dbh->query($sql);
                          
                  $tmp $result->fetchAll(PDO::FETCH_ASSOC);
                          if (
                  count($tmp) > 0)
                          {
                              print 
                  "<table align='center'>\n";
                              print 
                  " <tr>\n <th>Konzerttermin</th><th>Veranstaltung</th><th>Kartenanzahl</th><th>Preis</th>\n</tr>\n";
                              foreach(
                  $tmp as $key)
                              {
                                  print 
                  " <tr>\n";
                                  print 
                  " <td>".$key['a_konzerttermin']."</td><td>".$key['a_veranstaltung']."<td>".$key['w_menge']."</td><td>".$key['a_preis']."</td>\n";
                                  print 
                  " </tr>\n";
                              }
                              print 
                  "</table>\n";
                          }
                          else
                              print 
                  "Keine Artikel im Warenkorb gefunden.";
                      }




                      public function 
                  anzeigen()
                      {
                          print 
                  "<table cellpading='5' align='center'>\n";
                          print 
                  " <tr>\n";
                          
                  #holen der numerischen Indizes
                          
                  $tmp array_keys($this->artikelArray);
                          
                  #Durchsuchen nach den assoziativen Schlüsseln
                          
                  foreach($this->artikelArray[$tmp[0]] as $key => $value)
                          {
                              
                  #Ersten Buchstaben groß setzen
                              
                  print "<th>".ucwords($key)."</th>";
                          }
                          print 
                  "\n</tr>\n";
                          
                  #Alle Datenfelder ausgeben
                          
                  foreach($this->artikelArray as $key => $value)
                          {
                              print 
                  "<tr style='text-align:center'>\n";
                              foreach(
                  $value as $subKey => $subVal)
                              {
                                  if(
                  $subKey == "preis"#prüfen, um Euro Text anzuhängen
                                      
                  print "<td align='right'>".$subVal." Euro</td>\n";
                                  else
                                      print
                  "<td>".$subVal."</td>\n";
                              }
                              print 
                  "<td><a href="".$_SERVER['PHP_SELF']."?id=".$key."">In den Warenkorb</a></td>\n";
                              print 
                  "</tr>\n";
                          }
                          print 
                  "</table>\n";
                      }






                      private function 
                  setArtikel($daten)
                      {
                          
                  $this->pdf->SetLeftMargin(35); # Setzt Rand
                          
                  $this->pdf->Cell(30,5,"Artikelnummer",1,0,'C');
                          
                  $this->pdf->Cell(60,5,"Artikel",1,0,'C');
                          
                  $this->pdf->Cell(30,5,"Preis",1,0,'R');
                          foreach (
                  $daten as $key => $value)
                          {
                              
                  $this->pdf->ln();
                              
                  $this->pdf->Cell(30,5,$key,1,0,'C');
                              
                  $this->pdf->Cell(60,5,iconv('UTF-8''ISO-8859-15'$value['name']),1,0);
                              
                  $this->pdf->Cell(30,5,$value['preis']." Euro",1,0,'R');
                          }
                      }





                      public function 
                  pdfliste()
                      {
                          
                  $this->pdf->setTitel("Liste bestellbarer Artikel");
                          
                  $this->pdf->AliasNbPages();
                          
                  $this->pdf->AddPage();
                          
                  $this->pdf->SetFont('Times''',12);
                          
                  $text "Sehr geerter Kunde,\n\nvielen Dank, dass Sie sich".
                              
                  "für unser Angebot interessieren. Folgende Artikel ".
                              
                  "können Sie in unserem Online-Shop (http://".
                              
                  $_SERVER['HTTP_HOST'].") bestellen.\n";
                          
                  $this->pdf->setText($text);

                          
                  $this->setArtikel($this->artikelArray);
                          
                  $text "\n\nVielen Dank für Ihr Interesse.";
                          
                  $this->pdf->setText($text);
                          
                  $this->pdf->Output();
                      }


                      public function 
                  setKundenNummer ($kennung$passwort)
                      {
                          return 
                  $this->kunde->setKundenNummer($kennung$passwort);
                      }

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

                      public function 
                  setKundenDaten ($daten)
                      {
                          return 
                  $this->kunde->setKundenDaten($daten);
                      }
                  }
                  ?>

                  Kommentar


                  • #10
                    Hab nun in der class_artikel.php die public function anzeigen () folgendermassen umgeändert (ist dies richtig so?)

                    PHP-Code:
                    public function anzeigen()
                        {

                            
                    $sql "SELECT a_datum AS a_termin, a_artikelnr, a_name AS a_veranstaltung, a_menge AS a_vorrat, a_preis
                    FROM ws_artikel
                    WHERE a_menge > 0"
                    ;
                    $result $this->dbh->query($sql);
                    $tmp $result->fetchAll(PDO::FETCH_ASSOC);

                    # ausgabe formatieren
                    foreach ($tmp as $key => $value)
                    {
                    foreach(
                    $value as $key => $val)
                    {
                    $name split("_"$ky);
                    if (
                    $ky != 'a_artikelnr')
                    $this->artikelArray[$value['a_artikelnr']][$name[1]] = $val;
                            }
                    }
                        } 

                    Kommentar


                    • #11
                      Zitat von blackybaby Beitrag anzeigen
                      (ist dies richtig so?)
                      funktioniert es denn?

                      Ich weiss ja nicht wie es in deinem Editor aussieht, aber wenn du den Code mal vernünftig einrückst kannst du (und können deine Helfer hier) das einfacher nachvollziehen.

                      PHP-Code:
                      <?php

                      class foo
                      {
                          public function 
                      anzeigen()
                          {

                              
                      $sql "
                                SELECT a_datum AS a_termin, a_artikelnr, a_name AS a_veranstaltung, a_menge AS a_vorrat, a_preis
                                FROM ws_artikel
                                WHERE a_menge > 0
                              "
                      ;
                              
                      $result $this->dbh->query($sql);
                              
                      $tmp $result->fetchAll(PDO::FETCH_ASSOC);

                              
                      # ausgabe formatieren
                              
                      foreach ($tmp as $key => $value) {
                                  foreach (
                      $value as $key => $val) {
                                      
                      $name split("_"$ky);
                                      if (
                      $ky != 'a_artikelnr')
                                          
                      $this->artikelArray[$value['a_artikelnr']][$name[1]] = $val;
                                  }
                              }
                          }
                      }

                      Kommentar


                      • #12
                        Guten Morgen

                        Also es bringt mir keine Fehlermeldung und es zeigt mir auch alles sauber an. Das mit dem einrücken lern ich auch noch. Danke

                        LG
                        blackybaby

                        Kommentar


                        • #13
                          Hallo nochmal

                          Hab nun in der class_artikel.php die function anzeigen rausgenommen und in der class_webshop folgende Änderung vorgenommen:

                          PHP-Code:
                          public function anzeigen()
                              {
                                  
                          $sql "SELECT a_datum AS a_termin, a_artikelnr, a_name AS a_veranstaltung, a_menge AS a_vorrat, a_preis
                          FROM ws_artikel
                          WHERE a_menge > 0"
                          ;
                                  
                          $stmt $this->dbh->query($sql);
                                  echo 
                          "<table width='50%' align='center'>\n";
                                  while (
                          $row $stmt->fetch())  {
                                      echo 
                          "<tr>\n";
                                      echo 
                          "<td width='8%'>",$row['a_termin'],"</td>";
                                      echo 
                          "<td width='8%'>",$row['a_artikelnr'],"</td>";
                                      echo 
                          "<td widht='20%'>",$row['a_veranstaltung'],"</td>";
                                      echo 
                          "<td widht='5%'>",$row['a_vorrat'],"</td>";
                                      echo 
                          "<td width='9%'>",$row['a_preis'],"<br /></td>";
                                      echo 
                          "</tr>";
                                      echo 
                          "</table>";

                                  }

                              } 
                          Er gibt alles richtig aus , allerdings nimmt er die Einstellungen der Tabelle nur für die erste Zeile an warum? Kann mir da jemand helfen?


                          Anbei ein Screen dass es zeigen soll

                          Kommentar


                          • #14
                            Schau genau.. Du schliesst die table IN der Schleife, öffnest sie aber davor.

                            Wenn was komisch aussieht, hilft oft (sollte man immer tun) dem HTML Code validieren lassen. Sowas haut dir der Validator dann gleich um die Ohren.

                            Kommentar


                            • #15
                              ok hat sich erledigt, habs doch noch hinbekommen. Danke trotzdem für all eure Hilfe. Ohne euch wär ich nicht so weit gekommen

                              Kommentar

                              Lädt...
                              X