Ankündigung

Einklappen
Keine Ankündigung bisher.

DB-Klassen Design

Einklappen

Neue Werbung 2019

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

  • DB-Klassen Design

    Hallo PHPler

    ich bin gerade dabei mir eine DB Klasse zu basteln, nun stehe ich vor folgender Frage, um Tippfehler von Tabellennamen oder Tabellenfeldern zu verhindern hab ich mir gedacht, dass ich für jede tabelle in meiner Datenbank per Generator ein PHP File erstelle und darin eine Klasse erstelle mit einem "DBC_" (DatabaseConnector) als Prefix(z.b.: "DBC_config"). Nun erstelle ich für jedes Feld der Tabelle einen Getter und einen Setter.
    Nun habe ich eine DB Klasse, die die eigentliche Datenbankabfrage durchführt.
    Nur wie genau soll ich das reallisieren, also bezogen auf die Unterklassen, die in den erzeugten Files liegen, ich mag das mal an einem Beispiel versuchen zu erklären:
    Code:
    Struktur von `user`
    | id | name | age |
    .
    :
    DBC_user.php:
    PHP-Code:
    class DBC_user {
        
    // Fields
        
    private $id;
        private 
    $name;
        private 
    $age;
     
        
    // Output Cacher
        
    private $output;
     
        
    // GETTER
        
    public function get_id () {
            return 
    $this->id;
        }
        public function 
    get_name () {
            return 
    $this->name;
        }
        public function 
    get_age () {
            return 
    $this->age;
        }
     
        
    // SETTER
        
    public function set_id $value null ) {
            
    // Überprüfungsstruktur hängt vom Datentyp des Feldes ab ..
            
    if ( check($value) ) {
                
    $this->id value;
            } else {
                return 
    false;
            }
        }
        public function 
    set_name $value null ) {
            
    // Überprüfungsstruktur hängt vom Datentyp des Feldes ab ..
            
    if ( check($value) ) {
                
    $this->name value;
            } else {
                return 
    false;
            }
        }
        public function 
    set_age $value null ) {
            
    // Überprüfungsstruktur hängt vom Datentyp des Feldes ab ..
            
    if ( check($value) ) {
                
    $this->age value;
            } else {
                return 
    false;
            }
        }

    nun meine eigentlichen Fragen:
    wie genau soll ich auf die MainDBKlasse zugreifen, normalerweise rufe ich sie folgendermaßen auf, manuell..
    PHP-Code:
    $dbc = new db(); // Klasse erzeugen
    $dbc->setTableName("user"); // Setze Tabelle
    $dbc->setTableConditions(array("id"=>1)); // Setze WHERE Bedingung
    $data $dbc->getData(); // Schreiben der Daten in $data
    var_dump($data);
     
    // Beispiel-AUSGABE:
    Array(...) 
      [
    0] => array (3)
          [
    "id"] => "1"
          
    ["name"] => "admin"
          
    ["age"] => "19"
    ..... 
    Wie soll ich die Daten speichern, reicht einfach in eine Variable, wie mach ich das, wenn ich z.b. nur eine Spalte abrufen will ..?

    wie genau sollte die ausgabestruktur ausschauen ...?

    was für zusätzliche Funktionen sollte ich in das Template einbinden ?

    ich dachte z.b. an eine Funktion, die automatisch einen Timestamp einfügt, beim INSERT neuer Daten und bei UDATE soll ein Timestamp bei last_change hinzugefügt werden ...

    danke schon jetzt für eure Anregungen !!!

    ich hoffe dieses Thema ist angebessen für die Rubrik Software-Design ...

    lg Phillkill12
    PHP-Code:
    if ( $humans >= ) {
       
    war ();



  • #2
    Irgendwie versteh ich grad nicht worauf du hinaus willst. Außerdem weiß ich nicht genau, was du jetzt wissen willst.
    Im allgemeinen IMHO ist es nicht so schön und gut für jeden Tabelle eine eigene Klasse anzulegen.

    Könntest du dein Problem für mich genauer beschreiben.
    "My software never has bugs, it just develops random features."
    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

    Kommentar


    • #3
      Du solltest eine Klasse entwerfen die Deine Abfragen zusammenbaut, diese dann innerhalb der Klasse ablegen und und Methode generieren die Dir die Ergebniss zuürckgeben die Du brauchst, oder was meinst Du genau?

      PHP-Code:
      $db = new db;
      $db->setTable('db_news');
      $db->setSelect('feld1, feld2');
      $db->setWhere("feld1 = '?'"$WERT1);
      $db->setOrder('datum DESC');
      $db->setQuery('select'); 
      bei mir steht dann in $db->aValue das Erbnis als Array drin
      Gruß Werner
      Mein kleines Projekt: Fussball Satrup
      Wird ein OpenSource CMS für Fussballvereine

      Kommentar


      • #4
        danek für die schnellen antworten !!

        Zitat von Paul.Schramenko Beitrag anzeigen
        Könntest du dein Problem für mich genauer beschreiben.
        ja sicher !!

        also oft hat man ja beim programieren das Problem, in diesem Fall bei Mysql dass man Namen von Variablen falsch schreibt ... diese Probleme werden allerdings von Editoren bemerktund man bekommt vorschläge mit Namen ... bei Tabellennamen oder Feldern bekommt man keine Vorschläge ... deshlab hab ich mir gedach, wenn ich für jede Tabelle eine Klasse anlegt, dann wird einem vieles, meiner ansicht nach vereinfacht, man bekommt vom Editor sofort vorschläge angezeigt ... und tut sich meiner ansicht leichter beim programmieren ...

        Im allgemeinen IMHO ist es nicht so schön und gut für jeden Tabelle eine eigene Klasse anzulegen.
        warum meinst du ..?
        ich sehe sofort, welche Tabellen es gibt und Welche Felder und sogar welche datenfeldtypen ...

        Du solltest eine Klasse entwerfen die Deine Abfragen zusammenbaut,
        das ist meine MainDBKlasse ... ich habe eh ein beispiel hingeschrieben, wie die arbeitet ...

        bei mir steht dann in $db->aValue das Erbnis als Array drin.
        ich hab mir nur gedacht, wie das ist, ich kann ja per GETTER einfach auf jedes Feld zugreifen, wenn ich eben nur in array haben will mit z.b. IDs oder ähnliches, oder ist das nicht sinnvoll ..?
        PHP-Code:
        if ( $humans >= ) {
           
        war ();

        Kommentar


        • #5
          Ok, wenn ich Dich richtig verstanden habe macht das wenig Sinn.
          Wenn man nicht weiß was man abfragen will/muß sollte man es sein lassen.

          Oder: Erzeuge eine Methode die die Struktur / Spaltennamen und ausliest und Dir oder Deinem Objekt zurückgibt.
          Gruß Werner
          Mein kleines Projekt: Fussball Satrup
          Wird ein OpenSource CMS für Fussballvereine

          Kommentar


          • #6
            Oder: Erzeuge eine Methode die die Struktur / Spaltennamen und ausliest und Dir oder Deinem Objekt zurückgibt.
            ich weiß nicht, ob du mich ganz richtug verstanden hast ... ich will eben diese Strucktur in meiner Klasse wieder finden ... z.b. kann ich dadurch automatische Timestamps einfügen für last_changes oder created ... oder andere Features, die ich nur in meinem Generator-Teplate ändern muss und dann das in all meinen DB-Klassen wider finde ... ein weiteres Beispiel wäre eine Automatischer übersetzung (JOIN der Übersetzungstabelle ... ) ich hoffe, dass ich mich richtig ausgedrückt habe ...
            PHP-Code:
            if ( $humans >= ) {
               
            war ();

            Kommentar


            • #7
              1. Naja, bei kleinen Applikationen kannst du das sicher machen, aber was passiert, wenn du beispielsweise mehrere hundert Tabellen hast?!
              2. Was machst du mit JOINS, wie willst du diese verarbeiten?
              3. Ich würde eher deine MainDBKlasse erweitern.

              4. Wenn du Feldernamen oder Tabellennamen falsch schreibst kannst du das sowieso ganz leicht debuggen, weil dann sowas steht wie "table XY does not exists". Daher sehe ich da keinen großen Sinn...
              "My software never has bugs, it just develops random features."
              "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

              Kommentar


              • #8
                Hallo PhillKill,
                das was du machen willst ist durchaus legitim. Such beispielsweise einfach mal nach "Active Record" oder "ORM", "Propel" usw. Da findest du einige Beispiele wie man sowas machen kann.

                Sowas kurz mal selbst zu schreiben ist nicht so einfach. Zumindest nicht, wenn du nicht nur triviale Fälle abdecken willst sondern auch Joins und kompliziertere Abfragen.... Daher bietet es sich schon an was fertiges zu nehmen. Entweder gleich ein Framework, dass sowas mitbringt (Lithium, CakePHP, Zend, ...) oder eben Bibliotheken wie Propel
                Create your own quiz show.

                Kommentar


                • #9
                  Sowas kurz mal selbst zu schreiben ist nicht so einfach
                  ich schreib dass nicht ganz schnell so, so ... ich schreib des ganze für mein CMS ... und das ist nicht schnell ... da steht sehr viel entwicklungsarbeit dahinter, und da mag ich, dass des ganze auch wirklich gut läuft!



                  ...aber was passiert, wenn du beispielsweise mehrere hundert Tabellen hast?!
                  mein CMS hat 15 -20 Tabellen ... kommt darauf an welche Plugins installiert sind ... also keine rede von hunderten Tabellen ... also eine reine entwicklung für mein CMS ... bei kleinen Projekten verwendende ich so und so nur meine DB-Klasse für die Manuelle eingabe einer Query ...



                  Was machst du mit JOINS, wie willst du diese verarbeiten?
                  Die einegtlichen wirklichen JOINs, die ich ausführe sind die von der Translationstabelle ... die meine Kompletten Übersetzungen beinhaltet ...



                  Ich würde eher deine MainDBKlasse erweitern.
                  Das mache ich so und so ... JOIN funktion erweiterung ...



                  Wenn du Feldernamen oder Tabellennamen falsch schreibst kannst du das sowieso ganz leicht debuggen, weil dann sowas steht wie "table XY does not exists". Daher sehe ich da keinen großen Sinn...
                  Aber zum schreiben von Quellcode ist man sicher schneller wenn man des mit den Klassen macht ... und man braucht sich keine gedanken über schreibfehler machen oder ähnliches ...




                  das was du machen willst ist durchaus legitim. Such beispielsweise einfach mal nach "Active Record" oder "ORM", "Propel" usw. Da findest du einige Beispiele wie man sowas machen kann.
                  Danke, ich werd mir das einmal anschauen und mal den ganzen Generator samt Telmplate erstellen ... oder soll ich nur ein File anlegen ... das das anlegt ... für jede Tabelle ... meine Idee wäre halt dass ich ein Template mit Platzhaltern erstelle ... und das ganze per str_replace ersetze ... welche der beiden Methodes ist gescheiter ...? Oder gibt es sonst noch eine andere idee von euch, wie ich des umsetzten kann ...
                  danke schon jetzt für eure hilfe ...
                  PHP-Code:
                  if ( $humans >= ) {
                     
                  war ();

                  Kommentar


                  • #10
                    Zitat von PhillKill12 Beitrag anzeigen
                    ich schreib dass nicht ganz schnell so, so ... ich schreib des ganze für mein CMS ... und das ist nicht schnell ... da steht sehr viel entwicklungsarbeit dahinter, und da mag ich, dass des ganze auch wirklich gut läuft!
                    So einfach ist das nicht. Das kostet ganze Entwicklerteams mehrere Tage wenn nicht Wochen oder Monate Arbeit so etwas "gutes" zu Entwickeln... Und trotzdem sind immer wieder Bugs drin!

                    Zitat von PhillKill12 Beitrag anzeigen
                    mein CMS hat 15 -20 Tabellen ... kommt darauf an welche Plugins installiert sind ... also keine rede von hunderten Tabellen ... also eine reine entwicklung für mein CMS ...
                    Wiederverwendbarkeit? Null?

                    Zitat von PhillKill12 Beitrag anzeigen
                    bei kleinen Projekten verwendende ich so und so nur meine DB-Klasse für die Manuelle eingabe einer Query ...
                    Schreib dir doch eine DB-Klasse, die gut ist und die du auch wieder verwenden kannst... Hab ich für mich persönlich gemacht und bin sehr zufrieden damit, hab ich schon in verschiedenen Projekten angewendet.


                    Zitat von PhillKill12 Beitrag anzeigen
                    Die einegtlichen wirklichen JOINs, die ich ausführe sind die von der Translationstabelle ... die meine Kompletten Übersetzungen beinhaltet ...
                    Also hast du an der Stelle schon mal die erste Hürde mit deinen Klassen. Wie willst das abbilden?

                    Zitat von PhillKill12 Beitrag anzeigen
                    Das mache ich so und so ... JOIN funktion erweiterung ...
                    Das hat nichts mit Erweiterung zu tun. Du feurst einfach ein SQL ab, in dem ein Join drin ist.

                    Zitat von PhillKill12 Beitrag anzeigen
                    Aber zum schreiben von Quellcode ist man sicher schneller wenn man des mit den Klassen macht ...
                    Ähm nein, da du ja erstmal die Übelst vielen Klassen schreiben musst, dann evt. noch eine Klasse um kompliziertere Abfragen abzufeuern. Oder von mir aus auch nur JOINS.

                    Zitat von PhillKill12 Beitrag anzeigen
                    und man braucht sich keine gedanken über schreibfehler machen oder ähnliches ...
                    Wie schon mal erwähnt, sind Schreibfehler in der DB eh schnell gefunden. Und wenn du dir Namenskonvtionen erstellst und dich auch an dies hälst ist das mit den rechtschreibfehler auch kein Problem.


                    Zitat von PhillKill12 Beitrag anzeigen
                    mal den ganzen Generator samt Telmplate erstellen ... oder soll ich nur ein File anlegen ... das das anlegt ... für jede Tabelle ... meine Idee wäre halt dass ich ein Template mit Platzhaltern erstelle ... und das ganze per str_replace ersetze ... welche der beiden Methodes ist gescheiter ...? Oder gibt es sonst noch eine andere idee von euch, wie ich des umsetzten kann ...
                    danke schon jetzt für eure hilfe ...
                    Mir grauts schon jetzt davor diesen Code zu sehen
                    "My software never has bugs, it just develops random features."
                    "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                    Kommentar


                    • #11
                      um Tippfehler von Tabellennamen oder Tabellenfeldern zu verhindern
                      dei Tippfehler merkst doch schnell, da Du mysql_errors bekommst die Du Dir dann ausgeben lassen kannst.
                      Eine if-else-Abfrage nimmt, ordentlich geschrieben eine Menge Platz weg. Platzsparend geht es mit einem ternären Operator.

                      Kommentar


                      • #12
                        Zitat von Koala Beitrag anzeigen
                        dei Tippfehler merkst doch schnell, da Du mysql_errors bekommst die Du Dir dann ausgeben lassen kannst.
                        ja schon klar ... nur durch dieses Klassen-Systsem muss man erst garnet nach SQL Fehlern suchen ... dadurch kann man sich voll aufs entwickeln konzentrieren und muss ich nicht mit iwelchen kleinen SQL Fehlern beschäftigen ... weil wenn man viele DB-Verbindungen hat, dann kann es sein, dass man etwas braucht, bis man den Schreib / Tippfehler findet und auch korrigieren kann ...
                        PHP-Code:
                        if ( $humans >= ) {
                           
                        war ();

                        Kommentar


                        • #13
                          Ähm naja finde ich jetzt persönlich nicht, aber wenn du das für nötig erachtest, will ich da ma nix gegen sagen, wobei ich es für ein wenig übertrieben halte.
                          "My software never has bugs, it just develops random features."
                          "Real programmers don't comment. If it was hard to write, it should be hard to understand!"

                          Kommentar


                          • #14
                            ja ... auf jeden Fall ich bin gerade dabei mir die Templates, also das Grunddesign der Klassen zusammenzubauen ... ich hab mir das folgender Maßen "zusammengeschnipselt":
                            • pro Feld ein Setter und ein Getter
                            • pro Tabelle ein Joiner
                            • ein finder
                            • ein save
                            • ein update
                            • ein delete
                            hätt sonst noch wer Ideen für weitere Funktionen ..?

                            danke

                            lg Philipp
                            PHP-Code:
                            if ( $humans >= ) {
                               
                            war ();

                            Kommentar


                            • #15
                              pro Tabelle ein Joiner
                              Nicht alle JOINs sind so trivial. SQL-Ausdrücke können beliebig komplex sein. Zudem ist ein JOIN eine Verknüpfung von 2 Tabellen, Du kannst ihn also nicht wirklich einem Objekt zuordnen.

                              Irgendwie sehe ich die Vision in Deiner Tabelle nicht.
                              --

                              „Emoticons machen einen Beitrag etwas freundlicher. Deine wirken zwar fachlich richtig sein, aber meist ziemlich uninteressant.
                              Wenn man nur Text sieht, haben viele junge Entwickler keine interesse, diese stumpfen Texte zu lesen.“


                              --

                              Kommentar

                              Lädt...
                              X