![]() |
[PHP] Klassenstruktur für Adressdatenbank
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. |
AW: [PHP] Klassenstruktur für Adressdatenbank
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. |
AW: [PHP] Klassenstruktur für Adressdatenbank
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:
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.
$myList = Contact::byCountry('de')->limit(0, 20);
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 |
AW: [PHP] Klassenstruktur für Adressdatenbank
@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. |
AW: [PHP] Klassenstruktur für Adressdatenbank
Zitat:
Ausgegangen bin ich u.a. ![]() Wenn Du die Möglichkeit hast, solltest Du Dir auch mal MongoDB ansehen, ideal für Adressen usw. |
AW: [PHP] Klassenstruktur für Adressdatenbank
|
AW: [PHP] Klassenstruktur für Adressdatenbank
Klingt gut. auch wenn ich es selber bastele, werde ich mir das angucken.
|
AW: [PHP] Klassenstruktur für Adressdatenbank
Zitat:
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 |
AW: [PHP] Klassenstruktur für Adressdatenbank
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:
Es kommen noch ein paar Suchabfragen dazu und die Datenbank hat so um die 20 Felder.
<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> Könnte man auch noch was verbessern oder vereinfachen? Oder könnte ich irgendwo Probleme bekommen? |
AW: [PHP] Klassenstruktur für Adressdatenbank
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-Quellcode:
Liebe Grüße,
<?php $answer = 42;
Valentin |
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:23 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