AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein [PHP] Klassenstruktur für Adressdatenbank
Thema durchsuchen
Ansicht
Themen-Optionen

[PHP] Klassenstruktur für Adressdatenbank

Offene Frage von "Luckie"
Ein Thema von Luckie · begonnen am 3. Feb 2012 · letzter Beitrag vom 24. Mär 2012
Antwort Antwort
Seite 1 von 7  1 23     Letzte »    
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

[PHP] Klassenstruktur für Adressdatenbank

  Alt 3. Feb 2012, 21:11
Hallo,
ich habe ein private MySQL Adressdatenbank auf meinem Server. Bisher ist der PHP-Code ziemlich unstrukturiert und prozedural. Das wollte ich jetzt ändern und das ganze objektorientiert neu Programmieren. Ich finde aber noch keine mir zusagende Klassenstruktur.

Was ich bisher habe:
- eine Klasse für einen einzelnen Kontakt
- eine Containerklasse für mehrere Kontakte, die eventuell von einem Query zurückgegeben werden (Wird eventuell durch ein einfaches Array ersetzt)
- ....

Ja und jetzt weiß ich nicht so ganz weiter. Ich bräuchte noch Klassen für verschiedene Views: Einzelansicht, mehrere Datensätze (mit der Möglichkeit seitenweise zu blättern), eine Klasse für das Anlegen und Löschen eines neuen Kontaktes, ...

Und ich überlege, ob ich der Klasse für einen einzelnen Kontakt Methoden spendiere zum Speichern und Ändern oder ob ich das in die Klasse zum Anlegen und Löschen eines Kontaktes packe.

Gibt es für das Problem eine Standardlösung? Ich will aber keine fertigen Frameworks. Es ist für mich auch eien Fingerübung zum Lernen von PHP.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#2

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 3. Feb 2012, 23:06
Grundsätzlich solltest du ein Framework verwenden.
Mit PHP kann man unheimlich leicht Webseiten programmieren, welche viele Sicherheitslücken enthalten.
Ein Framework hilft etwas, dass zu vermeiden.

Die gängigen sind Zend_Framework oder etwas mehr high level das Flow3.
Flow3 ist derzeit das modernste was es gibt.
Die Leute haben sich viele Gedanken gemacht. Ziel war es "secure by default" zu sein.

Wenn du "nur" eine kleine Verwaltung willst, könntest du auch zum CMS PimCore greifen.

Wenn du es doch per Hand machen willst, dann verwenden zumindest eine Template-Engine z.B. Smarty und einen fertigen DB-Layer.
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#3

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 3. Feb 2012, 23:18
Eine Klasse zum Anlegen und Löschen von Kontakten? Ne!

Eigentlich suchst du einen ORM, wie CakePHP. Das ist ziemlich genau das was du brauchst. Wenn du dich mit der API solcher ORM mal auseinander setzen würdest, dann wäre dir sicher auch viel klarer, wie die Klassen zu strukturieren sind.

Ich finde eigentlich, dass du hier viel zu viele unnötige Klassen benutzt. Bei mir gäbe es eine einzige Klasse Kontakt. Diese macht alles was man braucht. Sie besitzt statische Methoden zum Anlegen eines neuen Kontakts (die dann den Kontakt zurückgeben), Methoden zum löschen und weitere statische Methoden zum Filtern. Contact::get() liefert alle Kontakte, Contact::findByPhone(...) alle mit bestimmter Nummer. In richtigen ORM wird ein Select erst ausgeführt, wenn man die Daten tatsächlich braucht. Damit benutzt man dann Konstrukte wie:

Code:
$myList = Contact::byCountry('de')->limit(0, 20);
Natürlich kann man hier viel mehr Klassen erstellen, das macht man auch insbesondere dann, wenn weitere solche Tabellen gebraucht werden. Der Contact sollte von (abstract) Table erben, die die wichtigsten Operationen wie get, insert, delete usw. bereitstellt. Die Contact-Klasse selbst definiert dann lediglich ihr Layout im Konstruktor ($this->add_column) und bietet weiterführende Methoden an. So benutze ich es jedenfalls seit Jahren.

Das ganze Framework dafür kann sehr sehr viel Arbeit kosten. Ich habe sowas allerdings auch schon mal selbst erstellt und es hat riesen Spaß gemacht. Dennoch ist man mit einem Framework, auch wenn ich mir bei dem Begriff in dem Fall nicht sicher bin, besser beraten. Gerade weil man dadurch mehr lernt als durch falsches Probieren. Überlege dir, ob CakePHP dir zusagt. Es reicht ja, wenn du den ORM daraus verwendest. Das Zend Framework ist auch genial, aber sehr umfangreich. Auch hier musst du nicht alles verwenden.

Du gehst den richtigen Weg und lernen wie es geht ist definitiv wichtig. Aber es ist schlauer sich anzuschauen wie andere Frameworks funktionieren, oder zumindest welche API sie anbieten. Sich das abzuschauen ist nicht verboten und bei Bedarf dann doch selbst zu machen, wenn man will, bringt mehr Vorteile. Schau doch wenigstens ein paar Tutorials zu ORM in PHP, damit kann man schon einen Überblick bekommen wie es dort aufgebaut ist.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 4. Feb 2012, 02:13
@generic: Wie ich schon sagte, ich will lernen. Und wenn ich nur fertige Framesworks verwende, bringt mir das nichts. Ich will Fehler machen, denn aus Fehlern lernt man. Und es ist auch nicht sinerheitsrelevant, weil es für mich ist und da eh kein anderer mit arbeitet. Und Mit CakePHPO habe ich schon sehr intensiv gearbeitet.

@Valle: Die Idee mit der einen Klasse hat was. Ich denke, das werde ich weiter verfolgen.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
webcss

Registriert seit: 10. Feb 2006
255 Beiträge
 
Delphi XE2 Professional
 
#5

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 4. Feb 2012, 09:19
@generic: Wie ich schon sagte, ich will lernen. Und wenn ich nur fertige Framesworks verwende, bringt mir das nichts. Ich will Fehler machen, denn aus Fehlern lernt man. Und es ist auch nicht sinerheitsrelevant, weil es für mich ist und da eh kein anderer mit arbeitet. Und Mit CakePHPO habe ich schon sehr intensiv gearbeitet.

@Valle: Die Idee mit der einen Klasse hat was. Ich denke, das werde ich weiter verfolgen.
Dann bau Dir Dein eigenes Framework. Vor zwei Jahren stand ich auch vor diesem Problem, hatte keine Ahnung von PHP, und hab nach langen Recherchen mein eigenes Framework gebastelt. Nebenbei habe ich damit MVC erstmal begriffen.
Ausgegangen bin ich u.a. an-mvc-framework-in-799-bytes/ hiervon, und habe mithilfe von diversen Tutorials mein eigenes gebaut.
Wenn Du die Möglichkeit hast, solltest Du Dir auch mal MongoDB ansehen, ideal für Adressen usw.
"Wer seinem Computer Mist erzählt, muss immer damit rechnen..." (unbekannt)
"Der Computer rechnet damit, dass der Mensch denkt..." (auch unbekannt)
mein blog
  Mit Zitat antworten Zitat
generic

Registriert seit: 24. Mär 2004
Ort: bei Hannover
2.415 Beiträge
 
Delphi XE5 Professional
 
#6

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 5. Feb 2012, 15:58
Doctrine als orm hat sich im PHP Bereich ziemlich verbreitet:
http://www.doctrine-project.org/
Coding BOTT - Video Tutorials rund um das Programmieren - https://www.youtube.com/@codingbott
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 5. Feb 2012, 23:31
Klingt gut. auch wenn ich es selber bastele, werde ich mir das angucken.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#8

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 6. Feb 2012, 06:23
Klingt gut. auch wenn ich es selber bastele, werde ich mir das angucken.
Andersrum wäre schlauer, erst gucken, dann machen. Aber sonst gute Idee.

Ich hoffe es macht dir so viel Spaß wie mir, denn ich musste mich echt zurückhalten nicht schon wieder sowas anzufangen.

Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#9

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 8. Feb 2012, 16:06
Könnte ich damit glücklich werden:
Code:
<?php

class DB_Exception extends Exception {}

class Contact extends DB_Exception{

   private $connection;
   private $resultset;
   public $id = array();
   public $name = array();
   public $vorname = array();
   
   function __construct() {
   
      include_once("config.php");
      
      $this->connection = mysql_connect($dbserver, $user, $password);
      if ($this->connection == false)
      {      
         die(mysql_error());
      }
      $db = mysql_select_db("usr_l3s11195_1");
      if ($db == false)
      {      
         die(mysql_error());
      }
   }
   
   function __destruct() {
      mysql_free_result($this->resultset);
      mysql_close($this->connection);
   }
   
   public function getByName() {         
      $query = "SELECT
               a.*, k.name as k_name
               FROM adressen_data a
               LEFT OUTER JOIN adressen_kat k on k.id = a.kategorie_id
               WHERE a.name LIKE '%".$this->name[0]."%'
               ORDER BY k.id, a.name, a.vorname, a.gesch_firma";
      $this->resultset = mysql_query($query);
      if (!$this->resultset) {
         throw new DB_Exception(@mysql_error());
      }      
      
      $this->clearFields();
      $this->fillFields();
   }
   
      public function getBySurname() {         
      $query = "SELECT
               a.*, k.name as k_name
               FROM adressen_data a
               LEFT OUTER JOIN adressen_kat k on k.id = a.kategorie_id
               WHERE a.vorname LIKE '%".$this->vorname[0]."%'
               ORDER BY k.id, a.name, a.vorname, a.gesch_firma";
      $this->resultset = mysql_query($query);
      if (!$this->resultset) {
         throw new DB_Exception(@mysql_error());
      }      
      
      $this->clearFields();
      $this->fillFields();
   }
   
   public function getById() {         
      $query = "SELECT
               a.*, k.name as k_name
               FROM adressen_data a
               LEFT OUTER JOIN adressen_kat k on k.id = a.kategorie_id
               WHERE a.id = '".$this->id[0]."'
               ORDER BY k.id, a.name, a.vorname, a.gesch_firma";      
      $this->resultset = mysql_query($query);
      if (!$this->resultset) {
         throw new DB_Exception(@mysql_error());
      }      
      
      $this->clearFields();
      $this->fillFields();
   }
   
   public function save() {
   
   }
   
   public function edit() {
   
   }
   
   private function fillFields() {
      while ($row = mysql_fetch_object($this->resultset)) {
         $this->id[] = $row->id;
         $this->name[] = $row->name;
         $this->vorname[] = $row->vorname;            
      }      
   }
   
   private function clearFields() {
      unset($this->id);
      unset($this->name);
      unset($this->vorname);
   }
}

?>
Code:
<?php

include_once("Contact.php");

   class View {
      private $contact;
      
      public function getContactByName($filterStr) {
         try {
            $this->contact = new Contact();
            $this->contact->name[0] = $filterStr;         
            $this->contact->getByName();
            $this->htmlOutPut();
         }
         catch(DB_Exception $e) {
            echo $e->getMessage();
         }
      }   
      
      public function getContactBySurname($filterStr) {
         try {
            $this->contact = new Contact();
            $this->contact->vorname[0] = $filterStr;         
            $this->contact->getBySurname();
            $this->htmlOutPut();
         }
         catch(DB_Exception $e) {
            echo $e->getMessage();
         }
      }

      public function getContactById($Id) {
         try {
            $this->contact = new Contact();
            $this->contact->id[0] = $Id;         
            $this->contact->getById();
            $this->htmlOutPut();
         }
         catch(DB_Exception $e) {
            echo $e->getMessage();
         }
      }
      
      private function htmlOutPut() {
         for($i=0; $i < count($this->contact->id); $i++) {
            if (count($this->contact->id) > 1) {
               echo "ID: ".$this->makeLink("index.php?action=show&id=".$this->contact->id[$i], $this->contact->id[$i])."<br>\n";
               echo "Name: ".$this->contact->name[$i]."<br>\n";
               echo "Vorame: ".$this->contact->vorname[$i]."<br>\n";
               echo "<br>\n";
            } else {
               echo "Name: ".$this->contact->name[$i]."<br>\n";
               echo "Vorame: ".$this->contact->vorname[$i]."<br>\n";
               echo "<br>\n";
               echo $this->makeLink("index.php", "Bearbeiten")." | ".$this->makeLink("index.php", "Löschen")."\n";
            }
         }   
         unset($contact);
      }
      
      private function makeLink($href, $caption) {
         return "<a href=\"".$href."\">".$caption."</a>";
      }
      
   }
?>
Code:
<html>
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
   </head>
   <body>
      <form action="index.php" method="GET">      
         <input type="hidden" name="action" value="search">         
         <select name="field" size="1">                        
            <option value="name">Name</option>
            <option value="vorname">Vorname</option>
         </select>      
         <input name="filterStr" type="text"></input>
         <input type="submit" value="Suchen"></input>
      </form>   
      
      <?php
         include_once("View.php");
         
         $action = $_GET['action'];
         $id = $_GET['id'];
         $filterStr = $_GET['filterStr'];
         $field = $_GET['field'];
         
         $view = new View();
         
         switch ($action) {            
            case "search":
               switch ($field) {
                  case "name":
                     $view->getContactByName($filterStr);
                     break;
                  case "vorname":
                     $view->getContactBySurname($filterStr);
                     break;
               }
               break;
            case "show":
               $view->getContactById($id);
               break;
            default:
               echo "<a href=\"index.php\"n>Neuer Kontakt</a>\n";
               break;
         }
      ?>
   </body>
</html>
Es kommen noch ein paar Suchabfragen dazu und die Datenbank hat so um die 20 Felder.

Könnte man auch noch was verbessern oder vereinfachen? Oder könnte ich irgendwo Probleme bekommen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

Registriert seit: 26. Dez 2005
Ort: Karlsruhe
1.223 Beiträge
 
#10

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 8. Feb 2012, 18:37
  • class Contact extends DB_Exception? Ich denke das war nicht beabsichtigt, oder?
  • Die Kontakte-Klasse sollte die Verbindung zu MySQL nicht selbst aufbauen.
  • Man schließt die MySQL-Verbindung auch nicht im Destruktor dieser Klasse, sondern am Ende des Programms.
  • Es empfiehlt sich auch eine abstrakte Bibliothek zu verwenden (PDO)
  • Damit mindert man auch das Risiko an SQL-Injections, die du hier auch eingebaut hast; Parameter verwenden!
  • Dein Exception-Handling ist etwas ungünstig. Mit einer richtigen Bibliothek geht das schlauer (ich habe einen Wrapper geschrieben, der automatisch eine Exception wirft, wenn ein Query fehlschlägt) Normalerweise werden diese an der richtigen Stelle erzeugt und bis zur obersten Instanz, einem Exception-Handler, durchgereicht. Hier kann man fein auf eine DEBUG-Variable prüfen und ggf. eine Meldung ausgeben oder gar eine Mail schicken.
  • Statt all die Felder zu kopieren, solltest du Getter und Setter verwenden.
  • Dein MVC ist nicht wirklich eins. Dein View übernimmt Exception-Handling und weiß zu viel vom Model. Einen Controller hast du nicht wirklich, bzw. mischst ihn mit dem eigentlichen View (HTML-Code).
  • Wenn du glücklich werden willst, verwende eine Template-Engine. Die kann man auch leicht selbst machen
  • Als kleiner Tipp: In PHP-Dateien ohne HTML-Code muss man die PHP-Klammer nicht schließen. Nutze das aus, denn damit spart man sich die ein oder andere Leerzeile im Quelltext, welche später (beim Setzen von Cookies und anderen Headers) Kopfschmerzen bereitet.
  • Als Anregung könnte ich den Zend Framework Coding Style Guide (o.ä.) empfehlen!

Du machst das schon ganz gut, denn ich habe schon viel schlimmeres gesehen. Man sieht dass du eine eigene Vorstellung hast, von dem was du tust. Allerdings fehlt hier noch einiges an Praxis-Erfahrung, bzw. do's und don'ts. Für meinen Geschmack ist das auch für ein kleines Privatprojekt noch nicht abstrakt genug. Mach deine Klassen kleiner und dümmer, dafür aber mehr davon.

Btw, haben wir jetzt nicht auch [php]?

<?php $answer = 42; Liebe Grüße,
Valentin
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 7  1 23     Letzte »    


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:22 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz