Ankündigung

Einklappen
Keine Ankündigung bisher.

[Erledigt] Best Practice DB Verbindung

Einklappen

Neue Werbung 2019

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

  • [Erledigt] Best Practice DB Verbindung

    Hallo Leute,

    ich hab ein Singleton Pattern verwendet für eine Mysqli extended Class.
    Nun übergebe ich dem Konstruktur der extendet Mysqli Class immer den Server,
    User, Passwort und DB wenn ich die Klasse in einer anderen Klasse aufrufe,
    gibt es auch eine Möglichkeit die Argumente in die extended Mysqli zu verschieben, so dass ich diese nicht mehr in anderen Klassen übergeben muss?

    lg

    makebzimage

  • #2
    Öhm, wieso übergibst du die Werte denn immer wieder, wenn du Singleton nutzt? Das ist doch sinnfrei. Entweder du nutzt Singleton und hast ein Objekt, dass die Zugangsdaten kennt oder du nutzt kein Singleton und hast mehrere Objekte, denen du immer wieder die Zugangsdaten senden musst.

    Irgendwie widersprichst du dir selber.
    [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

    Kommentar


    • #3
      Bitte was?

      1. Singleton bei Datenbank Instanzen ist sehr schlecht, was ist wenn du mal auf eine zweite DB zugreifen willst?

      2. Kannst du die Daten doch direkt in der Klasse die die MySQLi Klasse erweitert speichern.

      Kommentar


      • #4
        Hey,

        @Frank
        Ein Singleton Pattern sorgt dafür dass es nur ein Objekt gibt, ich brauche nur ein Objekt für mein Programm, einmal öffnen, Daten speichern/auslesen und Objekt NULL setzen. Hab das nach der Beschreibung auf dem Buch Design Patterns für PHP gemacht. Mit immer wieder meine ich ich müsste nun die Werte in der einen Methode übergeben, und wieder in der anderen. Aufrufen mit den Parametern in einer Methode. Und das nervt mich.

        @Florian
        Also eine zweite DB ist nicht angedacht, allerdings dachte ich immer das gerade ein Singleton Pattern für DB großartig ist, weil Programme die sehr oft DB Verbindungen aufbauen zuviel Speicher verbrauchen, und das Singleton sicherstellt das nur ein Objekt aufgerufen wird und nur dieses Speicher verbraucht.
        Ja man kann es auch direkt in der Klasse speichern stimmt, dachte mir dabei alles in einer conf zu speichern, weil dort auch noch andere Konstanten mit reinkommen, wie z.B. Pfade für Log oder email-adressen für Support etc.
        Hast du schon dass das auch mit einer conf geht?

        Kommentar


        • #5
          Wo wir gerade beim Thema sind: Ich habe mich mal gefragt ob man das ständige Verbinden zu einer Datenbank nicht umgehen könnte indem man mit Threading / Sockets /... (wie auch immer) ein PHP Script dauerhaft am laufen hat was mit der DB verbunden ist. Also das man nicht mehr direkt zur DB verbindet sondern nur noch mit dem zwischen-Script kommuniziert welches die empfangenen Daten zur DB durchroutet. Verständlich was ich meine? Würde das was an Performance bringen, da dadurch Verbindungswege gekürzt werden? Oder ist meine Idee totaler Schrott?

          Kommentar


          • #6
            @makebzimage: Was ein Singleton ist weiß ich wohl. Aber genau dieses Singleton löst ja das Problem, die Daten dauernd erneut übergeben zu müssen. Wenn du dein Objekt das erste mal erstellst, übergibst du deine Verbindungsdaten (Host, Benutzer, Passwort etc.). Sollen weitere Abfragen durchgeführt werden, nutzt du dein Singleton, um dein Objekt wieder abzugreifen. Dieses ist ja bereits mit der Datenbank verbunden. Wozu musst du also erneut Verbindungsdaten übergeben? Oder willst du mir erklären, dass dir dein Singleton ein Objekt erzeugt, dass du nach deiner einen Abfrage gleich wieder zerstörst? Dann kannst du auch gleich eine Funktion nehmen und brauchst gar kein Singleton mehr.

            @cycap. Dazu gibts doch pconnect?!
            [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

            Kommentar


            • #7
              @cycap. Dazu gibts doch pconnect?!
              Dann is wohl vor mir schon jemand auf diese geniale Idee gekommen :P aber dennoch kann mir jemand erklären wie das bei mysqli funktioniert? Im Manual steht dazu

              5.3.0 Added the ability of persistent connections.
              Wird das dann automatisch ab PHP 5.3.0 gemacht oder wie wird das eingeschaltet?

              Kommentar


              • #8
                Zitat von http://www.php.net/manual/en/mysqli.persistconns.php
                To open a persistent connection you must prepend p: to the hostname when connecting.
                [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

                Kommentar


                • #9
                  @Frank
                  Weil der Konstruktur von der extended Mysqli diese benötigt, ich weiß das man die Daten auch in der Klasse speichern kann, nur dachte ich es wäre clever alles in einer seperaten conf.php zu speichern, dann muss ich allerdings die Daten immer dem Konstruktor übergen, was mich letzendlich hier her geführt hat
                  Mal ein Beispiel was ich so mache:
                  ich hab verschiedene Klassen, jeder dieser Klassen fasst verschiedene Tätigkeiten zusammen, z.B. die Klasse category, dort soll es Methoden wie add, delete, set und get. Diese Methoden benötigen zum arbeiten halt die DB. Bei add wird ein Objekt erzeugt die daten werden an das objekt übergeben und das Objekt gibt die Daten weiter an die DB.
                  So habe ich mir das gedacht, leider bin ich in der Welt der OOP noch ein Neuling, und hab bisher dieses Design Pattern Buch gelesen, und möchte das Wissen auch anwenden, dafür habe ich dann das Singleton geschrieben, um nicht soviel speicher zu verbrauchen, nicht weil ich es muss sondern nur wegen dem technischen Anspruch. Deswegen wollte ich auch noch die Zugangsdaten in eine conf.php auslagern, damit man alles zentral konfigurieren kann.

                  Kommentar


                  • #10
                    @Frank: aaaah, das hätte man aber auch ruhig auf der Konstruktor-Seite erwähnen oder wenigstens verlinken können...

                    Kommentar


                    • #11
                      Ich verstehe immernoch nicht wo dein Problem mit dem Singleton liegt?
                      PHP-Code:
                      <?php
                      class Mydb extends Mysqli {
                          static 
                      $instance null;

                          public function 
                      __construct() {
                              
                      parent::init();
                          }

                          public function 
                      __clone() {
                              return 
                      $this;
                          }
                          
                          public static function 
                      getInstance() {
                              if (
                      is_null(self::$instance)) {
                                  
                      self::$instance = new Mydb();
                              }
                              return 
                      self::$instance;
                          }
                      }


                      //Einmal Verbinden
                      $db Mydb::getInstance();
                      $db->real_connect("host""username""password""database");

                      //Überall nutzen
                      $db Mydb::getInstance();
                      echo 
                      $db->host_info;
                      ?>
                      [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

                      Kommentar


                      • #12
                        hier meine Klasse

                        PHP-Code:
                        include 'config/config.php';

                        class 
                        extmysqli extends mysqli {

                            private static 
                        $getInstance null;

                            protected function 
                        __construct($server$user$password$db)
                            {
                                
                        parent::__construct($server$user$password$db);
                                    if(
                        mysqli_connect_errno ()){
                                        print 
                        "Verbindung konnte nicht aufgebaut werden!<br/>";
                                    }
                                    else {
                                        print 
                        "Verbindung wurde initialisiert!<br/>";
                                    }
                                }

                            public static function 
                        getInstance($server$user$password$db) {
                                    if(
                        self::$getInstance == null) {
                                        
                        self::$getInstance = new extmysqli($server$user$password$db);
                                    }
                                    return 
                        self::$getInstance;
                            }

                            public function 
                        __destruct(){
                                
                        $this->close();
                            }


                            private function 
                        __clone(){

                            }


                        ich möchte die Variante:
                        PHP-Code:
                        //Überall nutzen
                        $db Mydb::getInstance();
                        echo 
                        $db->host_info
                        Mit der conf.php an der ext mysqli

                        Kommentar


                        • #13
                          Wo ist dein Problem? Schön dass du deine Klasse gepostet hast. Aber wunder dich doch nicht, dass du überall deine Daten mitgeben musst, wenn du deinen Singleton entsprechend baust. Die Lösung habe ich dir oben im Code gezeigt. Wo du
                          PHP-Code:
                          $db->real_connect("host""username""password""database"); 
                          ausführst, und ob deine Verbindungsdaten aus der conf.php stammen oder nicht, ist hier doch komplett irrelevant! Informier' dich nochmal über Singleton.

                          Was hat denn bitte mysqli_connect_errno () im OOP verloren?
                          [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

                          Kommentar


                          • #14
                            @Frank
                            Frank bleib locker, es geht doch nur um die Frage, ob man eine conf.php in meine Klasse einbinden kann, damit ich die Daten nicht eingeben muss, ich möchte nicht in jeder Klasse die Daten neu übergeben, sondern nur einmal. Das hat erstmal gar nichts mit Singleton zu tun.

                            @all
                            Falls jemand noch eine andere Idee hat wie das zu designen ist, oder was dort State if the art ist wäre ich erfreut davon zu lesen.

                            Ich werde wohl erstmal es so machen das ich keine conf.php einbinde, sondern die Daten in der Klasse lasse, ohne die conf.php.

                            LG

                            makebzimage

                            Kommentar


                            • #15
                              Singleton ist schon der richtige Ansatz. Wenn du dein Singleton (getInstance) korrekt änderst, dann brauchst du auch nicht überall die Daten mit einzugeben. Momentan musst du das ja nur, weil den getInstance diese Daten verlangt. Wo liegt denn das Problem, dein getInstance so umzuändern, dass es keine Parameter mehr braucht.

                              Du kannst jederzeit ein Parameterloses Mysqli Objekt erstellen. Wie ich dir oben gezeigt habe z.b. mit mysqli::init(); Die eigentliche Verbindung zum Server sollte komplett unabhängig von deinem Singleton geschehen, denn das hat mit dem Singleton rein gar nichts zu tun.

                              Ob du diesen Verbindungsaufbau nun (wie in meinem Beispiel) mit real_connect später durchführst, oder (wie in deinem Beispiel) beim Aufruf vom Constructor, ist ja dir überlassen. Wenn du willst nimm eine Config Datei dafür, wenn nicht, dann lass es sein.

                              Ich habe so langsam das gefühl, dass dich gar nicht interessiert, wie man es umsetzt, da du ja anscheinend alle Lösungsansätze versuchlos ablehnst.

                              Du hast immer noch nicht geschrieben wo dein Problem darin liegt, einfach dein Singleton abzuändern und es in korrekter Art und Weise ohne Parameter zu nutzen. Du schreibst einfach nur es ist bei dir so und Punkt.

                              Deshalb habe ich dir auch geschrieben, du sollst dich nicht wundern, dass du überall deine Verbindungsdaten angeben musst. Immerhin hast du selbst programmiert, dass dies von nöten ist, indem du diese im Singleton forderst. Das dein Constructor diese Daten halt immer benötigt, ist ebenfalls keine Ausrede. Immerhin hast du deinen Constructor geschrieben und kannst ihn entsprechend ändern. Das instantiieren des mysqli Objektes braucht keinerlei Paramereter.

                              Du sollstest wirklich noch einmal Objektorientierung und vorallem das Singleton Pattern lernen, bevor du es falsch verwendest, und dich dann über unschöne Programm-Design gegebenheiten wunderst.

                              Wenn du jetzt, wie in deinem letzten post, echt nur wissen willst, wie man eine config Datei einbindet, dann Frage ich mich, was der ganze Salat hier soll, denn immerhin [MAN]include[/MAN] solltest du kennen, wenn du dich als fortgeschritten bezeichnest.
                              [IMG]http://media.ubuntuusers.de/portal/files/ubuntu.png[/IMG][IMG]http://sqlmanager.net/i/ico/mysql.gif[/IMG][SIGPIC][/SIGPIC]

                              Kommentar

                              Lädt...
                              X