Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] ADODB in Klassen nutzen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] ADODB in Klassen nutzen

    Moin, ich glaube ich habe das Prinzip von Klassen etc. noch nicht wirklich verstanden oder ich mache einen Fehler.
    Habe schon hier und in diversen Foren gefunden aber nichts wirklich aussagekräftiges gefunden.

    Ich erzeuge auf einer Seite mittels eingebunder Datei (require() ) ein ADODB-Objekt und verbinde mit diesem Objekt zu einer Datenbank.

    Wenn ich jetzt "manuell" auf der Seite mittels des DB-Objekts eine Abfrage erstelle funktioniert alles einwandfrei. Jetzt möchte ich allerdings eine "config"-Klasse erstellen, die Konfigurationen aus der Datenbank liest, die im weiteren Verlauf der Seite verfügbar sein sollen, und auch manipulierbar sein sollen.

    Instanzierung des Datenbankobjekts:
    PHP-Code:
    //DB Connection
                
    require("../configs/db.php"); 
    Inhalt der "db.php":
    PHP-Code:
    require("config.php");
        
    //Load ADODB
        
    require("../lib/adodb/adodb.inc.php");
        
    $db NewADOConnection('mysql');
        
    $db->Connect(SYSTEM_DATABASE_HOST,SYSTEM_DATABASE_USER,SYSTEM_DATABASE_PASSWORD,SYSTEM_DATABASE_DATABASENAME); 
    In der "config.php" werden nur extern die Konstanten definiert.

    einbinden meiner Klasse und instanzieren:

    PHP-Code:
    require("class/class.config.php");
                
    $config = new config(); 
    Inhalt der Klasse:

    PHP-Code:
    class config
            
    {
                public function 
    getConfig()
                    {
                        return 
    $db->Execute("SELECT * FROM ".DB_PREFIX."system_config");
                    }
    public function 
    setConfigItem($id,$item,$value,$description,$type)
                    {
                        
    $db->Execute("UPDATE ".DB_PREFIX."system_config SET 
                                        config_name = '
    $item', 
                                        config_value = '
    $value', 
                                        config_description = '
    $description', 
                                        config_type = '
    $config_type
                                        WHERE config_id = '
    $id'");
                        if(
    $db){return true;}
                    }
                public function 
    setConfigAll($config)
                    {
                        
                    }
            } 
    Der Aufruf von "getConfig()" erzeugt natürlich eine Fehlermeldung von ADODB, das "Execute" auf ein null-Objekt ausgeführt wird.
    Wie bekomme ich jetzt am günstigsten das Datenbankobjekt "$db" in meine Klasse?


  • #2
    Du legst eine property für $db an. Dann kannst du:
    - einen Konstruktor verwenden. Du übergibst beim Instanziieren der Klasse dein $db-Objekt.
    - setter verwenden. Du instanziierst die Klasse und rufst anschließend den Setter auf um das $db-Objekt zu übergeben.

    Knappes Beispiel, nur um das Vorgehen zu skizzieren:
    PHP-Code:
    <?php
    ini_set
    ('display_errors'1);
    error_reporting(-1);

    class 
    config {
        
        public 
    $dbAdapter;


        public function 
    __construct($db null) {
            if(
    $db !== null){
                
    $this->$dbAdapter $db;
            }
        }
        
        public function 
    setDbAdapter($db) {
            
    $this->$dbAdapter $db;
        }

        public function 
    getConfig() {
            return 
    $this->$dbAdapter->Execute("SELECT * FROM " DB_PREFIX "system_config");
        }
    }
    $config = new config($db);
    // or
    $config = new config();
    $config->setDbAdapter($db);
    Setz dich auch gleich mit solchen Dingen auseinander http://www.peterkropff.de/site/php/sichtbarkeit.htm
    Und du musst dich natürlich drum kümmern, dass du auch wirklich eine Datenbankverbindung hast wenn du mit der Datenbank spielen willst. Dafür kannst du zum Beispiel eine private Funktion getDbAdapter verwenden, in der du auf !== null / Klassenname des Objekts etc. prüfen kannst und entsprechend das Objekt zurückgibst oder einen Fehler ausgibst.
    Relax, you're doing fine.
    RTFM | php.de Wissenssammlung | Datenbankindizes | Dateien in der DB?

    Kommentar


    • #3
      Funktioniert prima danke!

      Auch wenn ich mich jetzt dann trotzdem nochmal als Nichtswisser oute:

      In einem Übungsskript habe ich mal gesehen das dort in selbsterstellten Klassen mittels einer Handler-Datei auf die Variable $db mittels "globals" zugegriffen werden konnte.

      Gibt es da auch eine Möglichkeit das in meinem Fall so umzusetzen?

      Meine Vermutung wäre das das Datenbankobjekt mittels property an die Handler-Klasse übergeben wird, und da es als "public" gekennzeichnet wurde können ja alle weiteren "inkludierten" oder "erbenden" Klassen diese globale Variable benutzen, richtig?

      Kommentar


      • #4
        Keine globals! Du willst dich nicht von globaler Konfiguration oder Umgebung abhängig machen, was du in deinen Klassen brauchst, musst du ihnen "einimpfen", so wie VPh es dir gezeigt hat.
        Über 90% aller Gewaltverbrechen passieren innerhalb von 24 Stunden nach dem Konsum von Brot.

        Kommentar


        • #5
          Okay, naja gut letzendlich ist der Aufwand der gleiche... Ob ich nun in jeder Methode "globals $db" hinzufüge, oder jede Klasse instanziere mit "new Klassenname($db)"... Danke für die Hilfe!

          Kommentar


          • #6
            Nein, ist es nicht. Das sind zwei ganz unterschiedliche paar Schuhe. Das globals-keyword zeigst, dass du erst seit ein paar Wochen effektiv entwickelst, oder das Internet für Recherchen um PHP herum recht selten nutzt, sonst wäre dir sicher schon aufgefallen, dass "globals" eine Altlast ist, die man am liebsten schon aus dem php-Core geworfen hätte, wenn es nicht leider so wahnwitzig viel kaputte Software geben würde, die darauf aufbaut.

            Ein Objekt sollte nie von etwas anderem als seinem internen State wissen. Kein(e) globals, kein static, keine Konstanten, keine userland-Funktionen. Wir schreiben das Jahr 2014. Schaue dir mal die SOLID-Prinzipien und den Begriff "DependencyInjection" an.
            Standards - Best Practices - AwesomePHP - Guideline für WebApps

            Kommentar


            • #7
              Mir ist bekannt das globals eine "Altlast" ist und nicht benutzt werden sollte. Ich hatte auch nicht gesagt das es das gleiche ist, sondern der Aufwand derselbe ist. Das das einimpfen in jede Klasse besser ist, ist mir wohl klar.

              Kommentar


              • #8
                Definiere "Aufwand". Der Aufwand ist anfangs vielleicht etwas kleiner, später dann aber umso größer, wenn die Applikation wächst. Ab einer gewissen Größe werden derart strukturierte Projekte regelmäßig unwartbar und das Projekt beginnt bei der verbesserten, rund-erneuerten Version 2.0.
                Viel Erfolg!
                Standards - Best Practices - AwesomePHP - Guideline für WebApps

                Kommentar


                • #9
                  http://de.wikipedia.org/wiki/Aufwand

                  Spaß beiseite, was ich mit "Aufwand" meine ist, es gibt keine Entschuldigung warum man noch "globals" nutzen sollte, weil der Aufwand beim coden derselbe ist. Sicherlich hast du damit Recht das der eigentliche Aufwand und die Probleme später auftreten.
                  Ich halte mich auf jeden Fall jetzt fern davon :P

                  Kommentar

                  Lädt...
                  X