MySQL-Klasse kritisieren

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

  • MySQL-Klasse kritisieren

    Hallo,
    ich schreibe zurzeit in PHP5 eine MySQL-Klasse, hab mir dafür Kopffs's Tutorial etwas durchgelesen und daraus schnellsten versucht eine eigene Klasse zu schreiben.

    Es ist noch nicht ganz fertig, aber wollt ma bisschen Kritik hören.

    Die Klasse "DatabaseException" ist noch in bearbeitung.

    Database.class.php:

    PHP-Code:
    <?php class Database {

        protected 
    $linkID;
        protected 
    $queryID;
        protected 
    $charset;
        
        protected 
    $host;
        protected 
    $user;
        protected 
    $password;
        protected 
    $database;
        
        protected 
    $autoSelect;
        
         public function 
    __construct($host$user$password$database$charset 'utf8'$autoSelect true) {
        
    $this->host         $host;
        
    $this->user         $user;
        
    $this->password     $password;
        
    $this->database     $database;
        
    $this->charset      $charset;
        
    $this->autoSelect   $autoSelect;
        
        
    //connect
        
    $this->connect();
        
        
    //Select Database 
        //createDatabase ist currently not avaiable!
        
    if($autoSelect === true) {
          
    $this->selectDatabase();
        } else {
          
    $this->createDatabase();
          
    $this->selectDatabase();
        }
        
         }
         
        
    /**
         * Execute MySQL Connection!
         */
         
    public function __destruct () {
        if (
    is_resource ($this -> linkID)) {
          
    mysql_close ($this -> linkID);
         }
         
      }
    }
    ?>
    MySQLDatabase.class.php

    PHP-Code:
    <?php
     
    class MySQLDatabase extends Database {

        
    /**
         * Connects to MySQL Server
         */
        
    protected function connect() {
        
        
    $this->linkID mysql_connect($this->host$this->user$this->password);
        
        if(
    $this->linkID === false) {
          
    #throw new DatabaseException('Link-ID == false, connect failed', $this);
          
    echo "connect failed".$this->linkID;
        } else {
          echo 
    "OK";
        }
        }
        
        
    /**
         * Select MySQL-Database
         */
        
    protected function selectDatabase() {
            if (@
    mysql_select_db($this->database$this->linkID) === false) {
                
    #throw new DatabaseException("Cannot use database ".$this->database, $this);
          
    echo "Cannot use database ".$this->database;
            }
        }


     } 
    ?>
    test.php
    PHP-Code:
    <?php

        define
    ('DIR'dirname(__FILE__).'/');
        
        function 
    __autoload($class) {
          require_once(
    DIR.'/lib/'.$class.'.class.php');
        }

        
    $db = new MySQLDatabase ('localhost','root','pwd','test');
       
    ?>
    Welche Funktionen könnte ich noch hinzufügen?! Bzw. besser machen?!
    Zuletzt geändert von hiro; 06.09.2007, 00:33.

  • #2
    Naja, Methoden hat deine Klasse ja noch nichts! Da kann man nicht wirklich etwas zu sagen!

    Kommentar


    • #3
      Die Methoden schreibe ich erst heut Abend wenn ich wieder zaus bin.

      Also ich hab bis jetzt immer nur mysql_fetch_array benützt die anderen funktionen hab ich bis dato nicht gebraucht bzw. hab nicht verstanden was die genau machen. *doof*

      Kommentar


      • #4
        Den Ansatz der Fehlerbehandlung durch Exception finde ich gut, typisch für OOP.
        Die Query-Methode würde ich einfügen ^^
        Du solltest dir überlegen, wie du mit Ergebnissen von Select-Statements umgehst. Etwas in der Richtung mysql_fetch_assoc(), also ein Array je Datensatz, oder du überlegst dir etwas mit einem ResultSet-Objekt.
        Wichtige Funktionen sind auch:
        Anzahl Zeilen (mysql_num_rows())
        Anzahl veränderter Zeilen bei Delete etc. (mysql_affected_rows())
        Letzter erzeugter auto_increment (mysql_last_insert_id())

        Die Oberklasse Database solltest du als abstract deklarieren!

        Nicht hineinnehmen in die Mysql-Klasse würde ich solche Funktionen wie mysql_list_tables. Du gehst schon den Weg über eine Oberklasse, da würde ich solch datenbankspezifische Abfragen nicht mit in die Connector-Klasse packen. Wenn du diese Methoden benötigst, würde ich eher eine separate Klasse MysqlInfo oder so anlegen.

        PHP-Code:
          if($autoSelect === true) {
              
        $this->selectDatabase();
            } else {
              
        $this->createDatabase();
              
        $this->selectDatabase();
            } 
        Das finde ich überflüssig. Das Anlegen einer Datenbank sollte unabhängig von deiner Klasse geschehen!

        Kommentar


        • #5
          Hallo,
          also ich werd mir die einzelen Funktionen anschauen, weil ich bis dato nicht check was das Manual z.b mit "mysql_num_rows — Liefert die Anzahl der Datensätze im Ergebnis" meint. WTF?!^^

          Einige Methoden habe ich schom im Kopf die ich rein packen werden, und due Exception-Klasse werde ich so schreiben das die Fehler auf einer schönen Seite angezeigt werden.

          Was sind die Vorteile von einer abstrakten Klasse? Bzw. wozu dient das genau?!

          Das mit $autoSelect war eigentlich für ein Script gedacht den ich basteln wollte...aber werd ich wohl raushauen müssen.

          Ist mein Code bis jetzt gut leserlich?
          Ist mein Code bis jetzt halbwegs sicher? (Sichtbarkeit der Variablen, Funktionen richtig gesetzt?)

          Entschuldigt mich wenn ich ein paar Begriffe falsch verwende, bin aber relativ neu was PHP&MySQL angeht.

          mfg
          hiRo

          Kommentar


          • #6
            Original geschrieben von hiro
            also ich werd mir die einzelen Funktionen anschauen, weil ich bis dato nicht check was das Manual z.b mit "mysql_num_rows — Liefert die Anzahl der Datensätze im Ergebnis" meint. WTF?!^^
            Vielleicht solltest du erstmal generell mit Datenbanken umzugehen wissen, bevor du wild drauf los eine Klasse codest oo

            Was sind die Vorteile von einer abstrakten Klasse? Bzw. wozu dient das genau?!
            http://de.wikipedia.org/wiki/Abstrakte_Klasse

            Ist mein Code bis jetzt gut leserlich?
            Ist mein Code bis jetzt halbwegs sicher? (Sichtbarkeit der Variablen, Funktionen richtig gesetzt?)
            Ähm... bei 70 Code-Zeilen erübrigt sich die Frage fast ^^;
            Da ist ja kaum was, was man bewerten könnte

            Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

            bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
            Wie man Fragen richtig stellt

            Kommentar


            • #7
              Vielleicht solltest du auch erstmal ein UML Anlegen, wenn du so ein Monsterprojekt wie ne Database klasse anfängst...
              Andererseits versteh ich nich ganz den Sinn dahinter - welchen zweck
              soll die Klasse denn im produktiven Einsatz verfolgen?
              Viel interessanter
              fänd ich jetz ne ordentliche Klasse zur Datenabstraktion, in die man
              Queries absetzen kann ohne auf SQL zugreifen zu müssen

              Oder ich raff das jetz einfach nich - dann helf mir auf die Sprünge

              @edit Warum hat deine Klasse Database ein Attribut Database??
              Zuletzt geändert von BugBite; 06.09.2007, 22:52.

              Kommentar


              • #8
                Vielleicht solltest du auch erstmal ein UML Anlegen, wenn du so ein Monsterprojekt wie ne Database klasse anfängst...
                Jetzt mal ehrlich, eine DB-Klasse ist schon eher einer der Grundsteine eines Projektes!

                Andererseits versteh ich nich ganz den Sinn dahinter - welchen zweck soll die Klasse denn im produktiven Einsatz verfolgen?
                Das loswerden der mysql_*-Funktionen und ein OOP-Ansatz! Stell dir vor, du willst irgendwann, warum auch immer, auf andere Datenbankfunktionen umsteigen. Dann viel Spaß beim Umschreiben deines Projektes. So tauscht du einfach die Klasse aus. Aber was erzähle ich da, er macht halt OOP!

                Viel interessanter fänd ich jetz ne ordentliche Klasse zur Datenabstraktion, in die man Queries absetzen kann ohne auf SQL zugreifen zu müssen
                Fände ich auch interessant, scheint mir aber wohl eher unmöglich, den kompletten SQL-Umfang mit allen Joins etc durch Methoden zu umfassen.

                Kommentar


                • #9
                  Original geschrieben von PHP-Desaster
                  Das loswerden der mysql_*-Funktionen und ein OOP-Ansatz! Stell dir vor, du willst irgendwann, warum auch immer, auf andere Datenbankfunktionen umsteigen. Dann viel Spaß beim Umschreiben deines Projektes. So tauscht du einfach die Klasse aus. Aber was erzähle ich da, er macht halt OOP!
                  Nachdem aber praktisch kaum ein Projekt ohne Anpassung der SQL-Queries auch mit einem anderen DBMS nutzbar ist, verliert das ganze dadurch doch enorm an Abstraktion...


                  Fände ich auch interessant, scheint mir aber wohl eher unmöglich, den kompletten SQL-Umfang mit allen Joins etc durch Methoden zu umfassen.
                  Methoden, die OOP-Gebilde der Daten zurück geben - fertig.
                  Ob die Daten dann aus der Datenbank per SQL-Query kommen, oder aus einer Datei ausgelesen werden, oder das ganze ein
                  PHP-Code:
                  $return = array();
                  for (
                  $i 0$i <= 10; ++$i) {
                    
                  $return[] = new object($i);
                  }
                  return 
                  $return 
                  ist, ist dann für die darüber liegende Applikation vollkommen irrelevant~

                  Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                  bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                  Wie man Fragen richtig stellt

                  Kommentar


                  • #10
                    Eine Abfrage wie
                    Code:
                    select x, y from irgendwas where x=123
                    ist ja kein Ding.
                    Ich meinte eher, wie setzt du eine query ala
                    Code:
                    select a.*, b.*, c.datefield
                    from irgendwas a
                    inner join (select max(id) as max from bla) as b
                     on( a.x=b.max )
                    left join nocheine as c
                     on( a.y=c.id and a.datefield<( c.datefield + interval 3 hour ) )
                    where a.sowieso='bla'
                    order by c.sort desc
                    vernünftig auf Methoden um?

                    Die Query ist natürlich jetzt komplett aus der Luft gegriffen, aber nur mal als Beispiel.

                    Kommentar


                    • #11
                      PHP-Code:
                      <?php

                      interface ein_ding {
                          public function 
                      Zeugs_holen_der_next_drei_stunden();
                      }

                      class 
                      das_ding implements ein_ding {
                          public function 
                      Zeugs_holen_der_next_drei_stunden() {
                              
                      $db die_db::get_instance();
                              
                              
                      $result $db->query("select a.id, b.title, c.datefield
                                  from irgendwas a
                                  inner join (select max(id) as max from bla) as b
                                   on( a.x=b.max )
                                  left join nocheine as c
                                   on( a.y=c.id and a.datefield<( c.datefield + interval 3 hour ) )
                                  where a.sowieso='bla'
                                  order by c.sort desc"
                      );
                              
                      $return = array();
                              while (
                      $row $result->fetch_assoc()) {
                                  
                      $return[] = $row;
                              }
                          }
                      }

                      class 
                      ein_anderes_ding implements ein_ding {
                          public function 
                      Zeugs_holen_der_next_drei_stunden() {
                              
                      $return = array(
                                  array(
                      'id' => 1'title' => "test"'datefield' => "2007-09-07 11:17:00"),
                                  array(
                      'id' => 2'title' => "blubb"'datefield' => "2007-09-07 11:18:00"),
                              );
                              
                              return 
                      $return;
                          }
                      }

                      $ding = new ein_anderes_ding();
                      var_dump($ding->Zeugs_holen_der_next_drei_stunden());

                      Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                      bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                      Wie man Fragen richtig stellt

                      Kommentar


                      • #12
                        Ja lol! Sowas habe ich natürlich nicht gemeint!
                        Ich dachte da eher, und so habe ich BugBite auch verstanden, an Methoden wie beispielsweise:
                        PHP-Code:
                        class DB {
                          public function 
                        select$fields$table$where /*, ...*/ ) {
                            
                        // ...
                          
                        }
                          public function 
                        insert$data$table ) {
                            
                        // ...
                          
                        }

                        Allerdings wäre dann halt die Frage, wie du ein solch komplexes Query vernünftig auf Methoden etc. abbilden willst, um halt kein SQL nutzen zu müssen!

                        Kommentar


                        • #13
                          Original geschrieben von PHP-Desaster
                          Ja lol! Sowas habe ich natürlich nicht gemeint!
                          Ich dachte da eher, und so habe ich BugBite auch verstanden, an Methoden wie beispielsweise:
                          Wozu wurde denn SQL erfunden? Damit ich das alles noch mit Funktionen abbilde? Oo

                          Ein netter Guide zum übersichtlichen Schreiben von PHP/MySQL-Code!

                          bei Klammersetzung bevorzuge ich jedoch die JavaCoding-Standards
                          Wie man Fragen richtig stellt

                          Kommentar


                          • #14
                            Richtig, im Grunde ist es Käse! ^^

                            Kommentar


                            • #15
                              Dass er OOP macht is mir klar, aber da finde ich die modellierung irgendwie komisch...
                              ich finds auch schöner wenn man daten kapselt und nicht unbedingt
                              die queries mit mysql_ absetzt
                              aber alleine schon dass die klasse database das attribut database hat bringt mich total aus dem konzept

                              anstatt database würde ich ehersowas wie ein dataset modellieren, welches man mittels eines adapters füllen kann

                              mir erscheint es einfach nich logisch, dass eine datenbank auf eine datenbank connected...

                              Kommentar

                              Lädt...
                              X