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
Benutzerbild von Luckie
Luckie

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

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
 
#2

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.416 Beiträge
 
Delphi XE5 Professional
 
#3

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
 
#4

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
 
#5

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
 
#6

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
 
#7

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
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#8

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 8. Feb 2012, 20:16
[OT]
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.
Kommt glaube ich darauf an, was für ein Typ man ist. Manche lernen besser, indem sie Code von anderen studieren, andere lernen besser, indem sie selbst welchen schreiben/versuchen etwas nachzubauen. Ich gehöre selbst zur zweiten Gruppe. Oft wird einem nämlich erst dann klar, warum bestimmte Dinge bei anderen Frameworks/Libs/Was-auch-immer auf eine bestimmte Weise gelöst wurden. Ich hatte auf diese Weise jedenfalls schon einige Aha-Erlebnisse.
[/OT]
  Mit Zitat antworten Zitat
Benutzerbild von Valle
Valle

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

AW: [PHP] Klassenstruktur für Adressdatenbank

  Alt 8. Feb 2012, 20:24
Ich hab hier mal ein kleines UML Diagramm skizziert.

Kursive Klassen sind abstrakt, unterstrichene Methoden sind statisch.

Ich garantiere keine Korrektheit oder Vollständigkeit, aber es sollte ungefähr zeigen wie ich mir das vorstelle.

Liebe Grüße,
Valentin
Angehängte Grafiken
Dateityp: jpg Framework.jpg (62,5 KB, 32x aufgerufen)
Valentin Voigt
BOFH excuse #423: „It's not RFC-822 compliant.“
Mein total langweiliger Blog
  Mit Zitat antworten Zitat
Antwort Antwort


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 05:42 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz