Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > Web Development
You last visited: Today at 02:00

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



OOP Datenbankverbindung

Discussion on OOP Datenbankverbindung within the Web Development forum part of the Coders Den category.

Reply
 
Old   #1
 
elite*gold: 0
Join Date: Jul 2010
Posts: 283
Received Thanks: 16
OOP Datenbankverbindung

Hallo Com,

als noob in der OOP hab ich mal eine Frage bezüglich dem Aufbau der Datenbankverbindung (mysqli).

Wie schon gesagt ich habe mit OOP bis jetzt kaum bis gar nicht gearbeitet. Da ich die Verwendung von OOP eig. einige Vorteile sehe möchte ich dies auch öfters verwenden.

Einer meiner Hauptprobleme ist das ich nie weiß wo ich die Datenbankverbindung aufbauen soll.
1. außerhalb der Klasse und wird dann per Klassenaufruf mitgegeben
2. immer im __construct oder eine eigene Methode in jeder Klasse?
3. eine Mainklasse für alle Klassen erstellen in der die Verbindung hergestellt wird und die Logs gesetzt werden
4. weitere Ideen?

Ich wäre froh wenn mir hier jemand ein guten Ratschlag geben könnte.

Mfg,
Kroko
Masterkroko1 is offline  
Old 01/25/2016, 13:43   #2
 
elite*gold: 0
Join Date: May 2015
Posts: 700
Received Thanks: 445
Du brauchst eigentlich nur eine Verbindung, aber vermutlich brauchen mehrere Klassen während einem Request eine Verbindung. Also wäre es unvorteilhaft, in jeder Klasse eine neue Verbindung aufzubauen.

Ich würde die Verbindung einmal aufbauen, und dann an jede Klasse übergeben (z.B. Konstruktor), die sie benötigt. Denn dadurch hast du folgende Vorteile (die mir spontan einfallen):
*) Du hast nur eine Verbindung.
*) Das Aufbauen der Verbindung ist von der Klasse getrennt: Auch wenn du deine Datenbankverbindung irgendwann völlig anders aufbaust, kannst du deine Klassen 1:1 weiter verwenden. Andernfalls müsstest du für eine Änderung (Verbindung wird anders aufgebaut) ewig viele Codestellen (jede Klasse) bearbeiten - das ist viel anfälliger für Bugs.
*) Du hast keinen duplizierten Code (eine Verbindung wird schließlich immer gleich aufgebaut).
*) Du kannst Unit-Tests machen (andernfalls hättest du keinen Einfluss, welche Datenbank deine Klasse verwendet).

Mit 3. meinst du sowas wie ein Singleton für die Datenbankverbindung? Für sowas sehe ich folgende Nachteile:
*) Wenn jemand neues mit deiner Klasse arbeitet, weiß er nicht, ob die Klasse überhaupt eine Datenbank benötigt (=> werden Methoden dieser Klasse Auswirkungen auf meine Datenbank haben?). Mit deiner Lösung 1. wird das durch den Konstruktor klar.
*) Du hast wieder keinen Einfluss, welche Datenbankverbindung die Klasse nutzt (=> Unit-Tests).

Persönlich finde ich also deine Lösung 1. am besten.

Anstatt in einer Klasse direkt mit der Datenbank zu kommunizieren, kannst du dir auch das DAO "Pattern" anschauen: Du hast eine Klasse, die die ganzen Queries ausführt, und dann einfache POJOs (oder Arrays an POJOs) zurückgibt. Dadurch hast du zum Beispiel folgende Vorteile:
*) Alle Queries sind zentral an einer Stelle, und fliegen nicht so im Code rum.
*) Die Datenbank ist von deiner Logik abstrahiert: Mit anderen DAO Klassen könntest du eine andere Datenbank verwenden.
*) Folglich kannst du bei Unit-Tests ganz auf eine richtige Datenbank verzichten (=> DAOs, die Dummy-Daten zurückgeben und Objekte in Attributen speichern).
algernong is offline  
Thanks
1 User
Old 01/25/2016, 14:27   #3
 
elite*gold: 0
Join Date: Jul 2010
Posts: 283
Received Thanks: 16
Mit Punkt 3 sowas gemeint: (habt erbarmen hab es schnell niedergeschrieben)

Das "DAO Pattern" kenn ich derzeit noch nicht werde es mir heut Abend mal angucken.

Punkt 2 streich ich dann schonmal generell aus meinem Kopf
Masterkroko1 is offline  
Old 01/27/2016, 13:53   #4
 
Wieland11's Avatar
 
elite*gold: 99
Join Date: Jul 2010
Posts: 236
Received Thanks: 59
Quote:
1. außerhalb der Klasse und wird dann per Klassenaufruf mitgegeben
2. immer im __construct oder eine eigene Methode in jeder Klasse?
Das sind ebenfalls zwei Sachen die ich seit einigen Wochen immer noch nicht richtig kann. Kann mir da jemand eine erklärung für doofe geben?
Wieland11 is offline  
Old 01/27/2016, 16:33   #5
 
elite*gold: 0
Join Date: Jul 2011
Posts: 44
Received Thanks: 5
Quote:
Originally Posted by Wieland11 View Post
Das sind ebenfalls zwei Sachen die ich seit einigen Wochen immer noch nicht richtig kann. Kann mir da jemand eine erklärung für doofe geben?
Geht es allgemein ums OOP oder um diesen Fall einer eigenen mysqli Klasse?

Hier dazu noch ein mögliches Beispiel:
Info: Habe hier mit einer extra Methode gearbeitet, d.h. die Verbindung wird nicht im Konstruktor erstellt. Somit kann ich überprüfen ob die Verbindung steht und darüberhinaus auch ob die Verwendung mit dem utf8-Charset funktioniert.

Diese Klasse kannst du dann so z.B. verwenden:

Wenn jemand noch Verbesserungen an diesem Code hat bitte sagen, bin immernoch am lernen!!! Wäre wirklich dankbar!!
callinq is offline  
Thanks
1 User
Old 01/28/2016, 08:53   #6
 
elite*gold: 0
Join Date: Jul 2010
Posts: 283
Received Thanks: 16
Bei mir ist das Problem ich wurde noch nie wirklich mit OOP konfrontiert deshalb weiß ich nicht genau wie die Klassen aufgebaut werden.

Hier ging es jetzt konkret über den Zusammenspiel mit der Datenbankverbindung & den einzelnen Klassen.

@callinq Ich selbst finde deine User-Klasse nicht optimal.
Du willst doch nicht in jeder Methode eine Datenbankverbindung aufbauen. Das sind dann doch wenn man pech hat pro Seite 5- x Verbindungen die aufgebaut werden. (Ergo das Script wird langsamer / Fehlerwahrscheinlichkeit erhöt sich / Code wird gedoppelt).

Da würde ich lieber die Verbindung außerhalb aufbauen und dann beim erstellen der Klasse die Verbindung mit geben und diese im __construct zuweisen.
^-- Das wäre dann Punkt 1



Ich denke ich habe nun dank algernong eine interessante Möglichkeit gefunden um dies Abzubilden. Ich werde es mal weiterhin Testen. Danke das du meine PNs solange beantwortet hast
Masterkroko1 is offline  
Thanks
1 User
Old 01/28/2016, 15:12   #7
 
elite*gold: 0
Join Date: Jul 2011
Posts: 44
Received Thanks: 5
Talking

Quote:
Originally Posted by Masterkroko1 View Post
Bei mir ist das Problem ich wurde noch nie wirklich mit OOP konfrontiert deshalb weiß ich nicht genau wie die Klassen aufgebaut werden.
Vielleicht hilft dir diese Seite. Dort wird zwar JavaScript erklärt, aber u.a. auch den Umgang mit Objekten.

Quote:
Originally Posted by Masterkroko1 View Post
@callinq Ich selbst finde deine User-Klasse nicht optimal.
Du willst doch nicht in jeder Methode eine Datenbankverbindung aufbauen. Das sind dann doch wenn man pech hat pro Seite 5- x Verbindungen die aufgebaut werden. (Ergo das Script wird langsamer / Fehlerwahrscheinlichkeit erhöt sich / Code wird gedoppelt).

Da würde ich lieber die Verbindung außerhalb aufbauen und dann beim erstellen der Klasse die Verbindung mit geben und diese im __construct zuweisen.
^-- Das wäre dann Punkt 1
Die Idee ist super, Danke! Hatte daran noch nicht gedacht.
Ich werde es direkt umsetzen.
callinq is offline  
Old 01/29/2016, 11:39   #8
 
elite*gold: 0
Join Date: Jul 2010
Posts: 283
Received Thanks: 16
@callinq
Wenn du eine Datenbankverbindung brauchst diese aber nicht aufbauen kannst dann kannst du eig das Script sofort beenden (natürlich mit einer Fehlermeldung)

Dann brauchst du nicht später im Script immer zu prüfen "ist die Verbindung gesetzt?"


Wieso benutzt du in deiner User-Klasse bei der Datenbankabfrage erst OOP ( $result = $statement->get_result() und 2 Zeilen später Prozedural (mysqli_num_rows($result)) & eine Zeile später wieder oop?
Hier solltest du dann eig. $result->num_rows verwenden.

Deine Klammerung trifft nicht mein Geschmacksstil. Da fehlen in meinen Augen ein paar Leerzeichen. In der Connection-Klasse schreibst du dein if einmal so " if () {" (meine bevorzugte schreibweise)
In der User-Klasse schreibst du es dann wieder so "if(){"
Beim "}else{" fehlen mir auch 2 Leerzeichen (naja ich mach eig. Umbrüche aber das ist wirklich Geschmacks / Vorschriftsache)

Nun zu dein Statement:
Wenn du schon deine Tabelle mit `` einschließt dann kannst du es auch bei den Spalten machen.
Die * suche sollte man eig. vermeiden damit selektierst du eig. immer mehr als du wirklich brauchst. Immer die gebrauchten Spalten einzeln auflisten.

Hm das wars erstmal von meiner Seite
Masterkroko1 is offline  
Old 01/29/2016, 23:31   #9
 
elite*gold: 0
Join Date: Jul 2011
Posts: 44
Received Thanks: 5
Quote:
Originally Posted by Masterkroko1 View Post
@callinq
Wenn du eine Datenbankverbindung brauchst diese aber nicht aufbauen kannst dann kannst du eig das Script sofort beenden (natürlich mit einer Fehlermeldung)

Dann brauchst du nicht später im Script immer zu prüfen "ist die Verbindung gesetzt?"
Habe ich genauso schon umgesetzt. :-)

Quote:
Originally Posted by Masterkroko1 View Post
Wieso benutzt du in deiner User-Klasse bei der Datenbankabfrage erst OOP ( $result = $statement->get_result() und 2 Zeilen später Prozedural (mysqli_num_rows($result)) & eine Zeile später wieder oop?
Hier solltest du dann eig. $result->num_rows verwenden.
Das war noch eines meiner ersten Programmfragmente einer Datenbankverbindung, deshalb noch Prozedual bzw. habe ich mir zu dem Zeitpunkt darüber keine Gedanken gemacht. Habe zudem inzwischen meine User-Class umgeschrieben, sodass ich dort keine Datenbankverbindung aufbau.
Quote:
Originally Posted by Masterkroko1 View Post
Deine Klammerung trifft nicht mein Geschmacksstil. Da fehlen in meinen Augen ein paar Leerzeichen. In der Connection-Klasse schreibst du dein if einmal so " if () {" (meine bevorzugte schreibweise)
In der User-Klasse schreibst du es dann wieder so "if(){"
Beim "}else{" fehlen mir auch 2 Leerzeichen (naja ich mach eig. Umbrüche aber das ist wirklich Geschmacks / Vorschriftsache)
Wie du sagst Geschmackssache, ich achte auf sowas nicht.
Quote:
Originally Posted by Masterkroko1 View Post
Nun zu dein Statement:
Wenn du schon deine Tabelle mit `` einschließt dann kannst du es auch bei den Spalten machen.
Verstehe nicht was du damit meinst. Weißt du denn wozu bind_param() da ist?
Quote:
Originally Posted by Masterkroko1 View Post
Die * suche sollte man eig. vermeiden damit selektierst du eig. immer mehr als du wirklich brauchst. Immer die gebrauchten Spalten einzeln auflisten.

Hm das wars erstmal von meiner Seite
In meiner eigenen User-Klasse selektiere ich nicht, brauche alle Daten, da ich alles in meine User-Klasse lade. War ja nur ein kurzes Beispiel, habe es aus meinem 'alten' Code abgeleitet.

Danke aber erstmal für dein Feedback.
callinq is offline  
Old 01/30/2016, 15:37   #10
 
elite*gold: 0
Join Date: Jul 2010
Posts: 283
Received Thanks: 16
Quote:
Originally Posted by callinq View Post
Wie du sagst Geschmackssache, ich achte auf sowas nicht.
Du solltest dich wenigstens für 1 "Schreibweise" entscheiden

Quote:
Originally Posted by callinq View Post
Verstehe nicht was du damit meinst. Weißt du denn wozu bind_param() da ist?
bind_param maskiert doch nur die Übergebene werten oder liege ich da falsch?
Ich meinte das mandie Spalten mit öhm backticks einschließt `` nicht '' erkennt man vll. nicht so schnell
Masterkroko1 is offline  
Old 02/02/2016, 15:43   #11
 
elite*gold: 0
Join Date: Jul 2011
Posts: 44
Received Thanks: 5
Quote:
Originally Posted by Masterkroko1 View Post
Ich meinte das mandie Spalten mit öhm backticks einschließt `` nicht '' erkennt man vll. nicht so schnell
Hab ich doch auch, passt doch inzwischen alles.. Danke dafür :-)
callinq is offline  
Old 02/03/2016, 23:29   #12
 
elite*gold: 0
Join Date: Apr 2014
Posts: 19
Received Thanks: 6
wie wärs mit ner singleton klasse und ner persistenten verbindung?
singleton wird üblicherweise nicht verwendet aber für sowas eignet es sich schon
wenn du ne persistente verbindung zur datenbank halten willst solltest du aber immer abfragen ob das connection attribut noch ne instanz von mysqli/PDO ist da mysql gerne die verbindung nach ner gewissen zeit abbricht
.Weekend. is offline  
Thanks
1 User
Reply


Similar Threads Similar Threads
[VB.NET]Datenbankverbindung in .dll aufbauen
03/29/2015 - .NET Languages - 16 Replies
Guten Tag liebe Leute, ich möchte mir ein kleines Programmchen schreiben, mit welchem ich meine Umsätze in eine Datenbank speichern kann, bzw. Ausgaben. Ich habe ein Programm blabla. Das ganze soll daheim intern ablaufen. Heißt auf meinem Raspberry Pi läuft die Datenbank und ich möchte in einer .dll die Datenbankverbindung dazu aufbauen. Die Einträge die ich bei mir eingebe, sollen dann dahin geschickt werden. Drücke mich vielleicht etwas komisch aus, aber ich weiß nicht wie ich es...
Datenbankverbindung funktioniert nicht
09/25/2014 - Web Development - 16 Replies
Hey Epvp! Ich bin gerade dabei, eine Website aufzusetzen und habe alles soweit fertig. Allerdings kann nicht auf meine Datenbank zugegriffen werden: Warning: mysql_connect() : No route to host in meineseite/inc/connect.php on line 8 Firewall ist auf meinem Computer ausgeschaltet und Ports sind bereits einige frei. Jemand einen Tipp? :confused:
Homepage verliert Datenbankverbindung
03/18/2012 - Metin2 Private Server - 0 Replies
Hallo Epvpler ;) Mich würde interessieren warum meine Homepage ständig die Verbindung zur Gameserver Datenbank verliert. GameServer + Homepage = 2 verschiedene Server Ich denke mal es liegt an der Serverkonfiguration. Jedoch würde mich nun interessieren was genau ich ändern müsste.
Mit VB Datenbankverbindung
03/22/2011 - .NET Languages - 1 Replies
Hallo epvp, wie kann ich mit Visual Basic 2008 eine Datenbankverindung mit xampp aufbauen und auch einträge auslesen und verändern ?? Mfg BrunoderBruno



All times are GMT +2. The time now is 02:00.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.