Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Datenbankverbindung aufbauen

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Datenbankverbindung aufbauen

    Hallo liebe Gemeinde,
    (das ist mein erster Post, und ich hoffe ich bin im richtigen Forum). Ich bin noch ein ziemlicher Anfänger was PHP angeht, aber versuche mich gerade an objektorientierter Programmierung. Und daher meine Frage: Ich möchte meine Datenbankverbindung in verschiedenen Klassen aufbauen, wie macht man das am geschicktesten, um Redundanzen zu vermeiden. Sollte ich die Verbindungsdaten fest in die Datenbankklasse codieren, und dann nach dem Namen des Objektes unterscheiden, welche Datenbank ausgewählt wird. Dachte da an einen switch case Mechanismus. Oder soll ich die Verbindungsklasse ohne Fütterung von fertigen Daten aufbereiten und diese bei jeder Instanziierung mitgeben. Nachteil dabei ist, dass ich das ja immer tun muss.
    Nochmals verdeutlich als Pseudocode:
    PHP-Code:
    //1. Möglichkeit
    class Verbindung(){
    if(
    instanziierung == A){
      ->
    Objekt erstellendas Verbindung zu DB1 hält
    }
    if(
    instanziierung == B){
      ->
    "" "" DB2
    }
    }

    //und dort, wo die klasse benötigt wird:
    private = new Verbindung();

    //2. Möglichkeit: Klasse als Art "Schablone", die erst bei Aufruf gefüllt wird
    class Verbindung{
      public 
    __construct(dbname, ...){
       ->
    Konstruktor in parametriesierter Form bereithalten
    }

    //Aufruf:
    private = new Verbindung(dbnameKonkret, ...); 
    Welches Vorgehen würdet ihr mir raten? Wie gesagt, bin noch ziemlicher Anfänger und erlerne gerade OOP. Allerdings will ich die guten Codestandards nicht verletzen und gleich von Anfang an gescheiht programmieren.

    Vielen Dank und Gruß an Alle.

  • #2
    @Mods: Ich glaub hier ist ein Spammer unterwegs, weil mir ein Mister Ad unter den Beitrag geschrieben hat.

    Kommentar


    • #3
      Gehört zum Forum

      Verstehe ich das korrekt, du hast mehr als eine DB auf die du innerhalb der Website zugreifen möchtest, benötigst also mehrere verschiedene DB-Verbindungen?

      Kommentar


      • #4
        Übergib die benötigte DB-Verbindung in dein Objekt - dazu gibt es immer wieder Threads hier, siehe zB hier vor kurzem: http://www.php.de/php-einsteiger/108...er-klasse.html

        weil mir ein Mister Ad unter den Beitrag geschrieben hat
        http://www.php.de/board-support/8899...mister-ad.html
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Erst einmal vielen Dank für die Antwort. Aber somit verstoße ich doch gegen das Don't repeat yourself Prinzip, weil ich ja somit eigentlich die gleichen Daten immer wieder nur übernehme und Änderungen somit schwer fallen. Ausserdem ist mir der Artikel bisschen zu schwer zu verstehen (bitte nicht böse sein).

          Kommentar


          • #6
            Hier, aus dem von hausl verlinkten Thread geklaut - so würde nun ein Model aussehen:
            PHP-Code:
            // Model-Klasse, von der die konkreten Models ableiten.
            // Diese Klasse gibt es genau einmal. Damit auch DRY!
            class Model {
               protected 
            $db// DB-Verbindung

               // DB-Verbindung beim Instanziieren mit übergeben
               
            public final function __construct(MySQLi $db
               { 
                  
            $this->db $db
               } 
            }

            // Konkretes Model. Die Objektvariable $db und der Konsutkrur werden geerbt,
            // müssen also nicht jedes mal neu geschrieben werden! DRY!
            class ConcreteModel extends Model

               public function 
            storeSomething($string
               { 
                  
            $this->db->... // Zugreifen auf DB
               


            Kommentar


            • #7
              Aber somit verstoße ich doch gegen das Don't repeat yourself Prinzip, weil ich ja somit eigentlich die gleichen Daten immer wieder nur übernehme und Änderungen somit schwer fallen.
              Wo wiederholst du dich denn, wenn du ein Datenbank-Objekt an eine andere Klasse weitergibst?

              Kommentar


              • #8
                Cool, das sieht gut aus mit Vererbung. Und mit Model ist wahrscheinlich eine Datenbankklasse gemeint.
                @Chris: Dass ich das Objekt ja immer mit den gleichen Daten befülle.

                Kommentar


                • #9
                  Jein! Das ist recht kompliziert, wenn man es genau definieren will. Aber Model ist sozusagen eine Klasse die eine Datenbankanbindung hat. Also keine Datenbankklasse, aber eine Klasse, die auf eine Datenbankklasse zugreifen kann. Die Model-Klasse ist dann die Vorlage für konkrete Models. Ein konkretes Model ist sozusagen ein Objekt/Klasse das du in der DB speichern willst.

                  (Wie gesagt das ist jetzt absolut keine Definition, nur damit du mal eine ungefähre Vorstellung erhältst. Mal schauen wer nun alles die Hände über dem Kopf zusammenschlägt ob dieser Ungenauigkeiten )

                  DRY ist übrigens auf den Programmcode bezogen, nicht darauf, was das Programm zur Laufzeit tut.
                  Also das hier verstößt gegen DRY:
                  PHP-Code:
                  $i 0;
                  $i++;
                  $i++;
                  $i++;
                  $i++;
                  $i++; 
                  Das hier nicht:
                  PHP-Code:
                  for ($i 0$i 5$i++); 
                  Beim ersten Bsp. schreibe ich wiederholt den selben Code ($i++) - genau das soll man nach DRY nicht tun.
                  Das zweite hat das selbe Ergebnis, versößt aber nicht gegen DRY. Dennoch ist es natürlich so, dass zur Laufzeit PHP einfach 5 mal stumpf $i++ rechnet. Das ist aber erlaubt. (Klar das Beispiel ist mathetmaitsch sinnfrei da man das auch eifnacher machen könnte.)

                  Kommentar


                  • #10
                    Also keine Datenbankklasse, aber eine Klasse, die auf eine Datenbankklasse zugreifen kann.
                    Ok, aber entsteht somit nicht eine Abhängigkeit, denn wenn eine Datenbankklasse nicht existiert, dann funktioniert das Model nicht mehr, und die Klassen, die vom Model erben. Und ich glaube gelesen zu haben, dass man immer nur direkte Abhängigkeiten schaffen sollte.

                    Kommentar


                    • #11
                      @Monolith: Ja ich weiss, aber ich meinte, ich muss ja in verschiedenen Dateien neue Objekte anlegen, und die befülle ich doch immer mit den gleichen Verbindungsdaten, z.B.
                      PHP-Code:
                      //Seite1
                      mysql = new MySQL(abcd);
                      //Seite 2
                      mysql = new MySQL(abcd); 
                      So meinte ich das.

                      Kommentar


                      • #12
                        Ja natürlich entsteht dadurch eine Abhängigkeit. Das ist aber nicht schlimm, zumindest wenn man das ganze so baut, dass man die DB-Komponente austauschen kann.

                        Zu deinem Beispiel-Code: Nein, wieso denn das? Wenn du einmal das Objekt $mysql erstellt hast, warum dann noch mal neu erstellen?

                        Kommentar


                        • #13
                          Zu deinem Beispiel-Code: Nein, wieso denn das? Wenn du einmal das Objekt $mysql erstellt hast, warum dann noch mal neu erstellen?
                          Ok, und wie können dann die verschiedenen Klassen drauf zugreifen? Lass ich das Objekt dann quasi unter der Klasse stehen und binde es zusammen mit der Klasse in die jeweilige Datei ein?

                          Kommentar


                          • #14
                            Ok, noch eine letzte Frage: wie übergibt man das datenbank objekt am geschicktesten.
                            1) Erst bei der Instanziierung in Form von
                            PHP-Code:
                            $database = new DB(abcd);
                            $klasse  = new Klasse($database); 
                            2) Fest kodiert in die jeweilige Klasse (Konstruktor), damit nur noch
                            PHP-Code:
                            $klasse = new Klasse(); 
                            aufgerufen wird, und DB ist schon vorhanden.

                            Kommentar


                            • #15
                              Ich denke, dass die genannten Beispiele diese Frage bereits beantworten.

                              Kommentar

                              Lädt...
                              X