| | | | |
| |||||||
| PHP-Fortgeschrittene Arbeiten mit PHP ohne Einschränkungen |
|
| | LinkBack | Themen-Optionen | Thema bewerten |
| | |
| PHP Code Flüsterer Registriert seit: 21.08.2005 Beiträge: 4682 PHP-Kenntnisse: Fortgeschritten | |
| | |
| Erfahrener Benutzer Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() | Zu 1: Du bildest ausschließlich die Funktionen der MySQL-Extension von PHP ab. Dazu braucht es nun wirklich kein OOP. Die nächste Extension des nächsten DBMS kann eine ganz andere API haben, und spätestens dann kommst Du in die Bredouille, dass die Austauschbarkeit nicht mehr gewährleistet ist. Zu 2: Die alte MySQL-Extension puffert die Ergebnisse der Abfrage intern sowieso im Speicher. Das musst Du nicht in Form eines Arrays noch ein zweites mal machen. Zu 4: Eine Klasse ist dann eine gute Klasse, wenn sie nicht nur einem Anwender und Anwendungsfall dienen kann. Gruß Jens |
| | |
| | |
| moderatives Dielektrikum Registriert seit: 21.05.2008
Beiträge: 35.987
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() | Naja, ganz verreissen würde ich die Klasse nicht. Immerhin werden hier schon mal die Verbindungsressource abstrahiert (einfach mysql_* und keine Ressource zu verwenden ist nämlich auch nicht die feine englische) und ein Exceptionhandling umgesetzt. @Leichti: Zumindest die Querygestaltung solltest Du imho ganz auslagern und dafür eine Queryklassse schaffen. Damit bist Du wesentlich freier, was komplexe Anfragen betrifft. getFullArray() scheint erstmal Overhead zu sein, es kommt aber darauf an, wofür man es benutzt - niemand sagt, dass es nicht zusätzlich ein getLine () oder dergl geben kann - die komplette Abfrage wird innerhalb der Anwendung gecacht. Bei mehrfachem Auslesen könnte man über einen Queryhash die fertige Datenmenge zurückgeben - man könnte das Array über eine Cachefunktion zu einer Art Persistenzschicht ausbauen, indem die Daten bspw. in die Session wandern und beim nächsten Aufruf ohne DB-Abfrage zur Verfügung stehen.
__________________ -- One pixel is still too big. Please make it smaller. ASAP. Initiative Mittelstand. Die wichtigste Gestaltungsregel im Screendesign ist Pi mal Daumen des Arbeitgebers. -- |
| | |
| | |||||
| Erfahrener Benutzer Registriert seit: 02.01.2009
Beiträge: 730
PHP-Kenntnisse: Fortgeschritten ![]() | Zitat:
Zitat:
Zitat:
Zitat:
Was mir noch aufgefallen ist: -MysqlException... du hast DB_Mysql gegen ein Interface implementiert, das ist schonmal gut, aber du machst das Konzept durch die MysqlException wieder kapput. Du nimmst dir damit die möglichkeit DB_Mysql gegen DB_irgendwas zu ersetzen. (ausser DB_irgendwas wirft auch MysqlException's) Korrekt wäre es eine allgemeine Datenbank Exception zu implementieren. PHP-Code: PHP-Code: PHP-Code: -getFullArray(): wie Jens Clasen schon gepostet hat ist das Ressourcen verschwendung. Das kann man zb umgehen indem man das resultset in ein Objekt packt und über das Objekt die Daten ausleist. Ganz primitv könnte das so aussehen: PHP-Code: | ||||
| | |
| | |||||
| Erfahrener Benutzer Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() | Ich nicht. Zitat:
Nein, kann man nicht. Lies es bitte im Zusammenhang: Zitat:
Zitat:
Zitat:
Deinen restlichen Aussagen stimme ich im großen und ganzen zu. IMHO fängt ein Datenbank-Wrapper dann an, langsam sinnvoll zu werden, wenn er mindestens die folgenden vier Bereiche umfasst:
Ansonsten fährt man nämlich einfach ohne DB-Wrapper (also für den Fall MySQL mit mysqli) besser... Gruß Jens | ||||
| | |
| | |
| Erfahrener Benutzer | Vielleicht solltet ihr nochmal das Eingangspost lesen, denn der Anspruch des Autors war es nicht, die perfekte Bibliothek für den Datenbankzugriff zu schaffen, die in aller Zukunft jede Anforderung leicht und bequem ermöglicht und die man nie wieder anfassen muss. "Dependency Injection" und OOP in einem Satz zu nennen und das so zu verwenden, dass eine Klasse per se schlecht ist, die Dependency Injection nicht erlaubt, hat einen gewissen Reiz. Aber sowas ist ungefähr als würde man argumentieren: "Die Kirsche schmeckt per se nicht wie eine Banane, also ist diese Kirsche einfach nur schlecht und gehört weggeworfen." Bitte vermischt hier nicht zwei unterschiedliche Ansätze, vor allem nicht, solange PHP nicht von Haus aus Dependency Injection udn AOP unterstützt. Mit dieser Argumentation wüprde man ungefähr grob geschätzt 99,9999% der PHP-Klassen und Bibliotheken als schlecht abstempeln. Inwieweit eine Abstraktion der Queries sinnvoll ist, darüber lässt sich gut streiten. Ich denke, dass gute und populäre DB-APIs nicht ohne Grund immer beide Wege anbieten, sowohl die Übergabe eines SQL-Strings, als auch das generische Zusammenbauen eines Queries. Verbaut man sich das einfache Übergeben eines vorgefertigen SQL-Strings, wird man irgendwann einmal vor der Situation stehen, dass die Bibliothek einen bestimmten Query so ungeschickt zusammenbaut, dass der Datenbank-Optimizer so ungeschickt arbeitet, dass man die Performance in den Keller zieht. Und wehe es behauptet nun einer, sowas würde es nie geben. Sowas könnt ihr meinetwegen in der Uni im Hörsaal behaupten. Die Praxis sieht so aus, dass die Art und Weise wie man Joins formuliert, oft auch Auswirkungen hat auf die Performance. Auch wenn das leider manchmal bedeutet, dass man Queries je nach Datenbanksystem umformulieren muss.
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
| | |
| Erfahrener Benutzer Registriert seit: 19.06.2009
Beiträge: 837
PHP-Kenntnisse: Fortgeschritten ![]() ![]() ![]() ![]() ![]() | 99,999% aller in PHP implementierten DB-Wrapper für MySQL sehen meiner Erfahrung nach aus wie der im Eingangspost. Sinn hab ich davon die wenigsten machen sehen. Ich sag damit nicht, dass die Klasse per se schlecht ist, weil sie *InsertBuzzwordHere* nicht kann, ich sag nur, dass sie überflüssig ist wie ein Kropf. Die Klasse bietet gegenüber nativen Lösungen wie mysqli oder von mir aus pdo absolut keinen Vorteil, also macht der Einsatz keinen Sinn. Der Einsatz würde erst dann Sinn machen, wenn sie einen Mehrwert bietet, also z.B. *InsertBuzzwordHere* kann. Die Möglichkeit einer Verwendung im Depedency Injection Pattern war ein Beispiel - grundsätzlich gilt das selbe auch schon bei einer einfachen Factory irgendwo (sagte ich übrigens oben auch schon), und selbst dass ist bei dieser fixen Form der Konfiguration schon nicht mehr ernsthaft möglich. Was das Stichwort Abstraktion von Queries angeht: Selbst ne vorgetäuschte Implementierung des prepared Statement Konzeptes in Verbindung mit ner Cursor-Funktion irgendwo ist besser als garnichts. Die Mindestanforderung würd ich da einfach beim Parameter-Handling und dem Verarbeiten von Standard-SQL ansetzen. Ganz so übertreiben (wie mein letzter Post zugegebener maßen klingt) würd ich es da ja garnicht wollen... Und nun noch mal zurück zur DI & co: Die Möglichkeit, DI, Factories und Registries zum Einsatz kommen zu lassen ist nicht allgemein und für jede Klasse (oder jede Handvoll davon) sinnig, bei Dingen die üblicherweise als generische Ressource irgendwo benötigt werden, macht es aber Sinn derartige Konzepte anbinden zu können. Sich von vornherein den Weg zu verschließen ist IMHO zu kurzsichtig. Nicht mehr und nicht weniger war die Aussage. Ich persönlich weiß nicht, was der Anspruch des TE ist, ich maße mir aber an zu behaupten, dass der Anspruch der falsche ist, wenn die gepostete Klasse ihn erfüllt. Leichti, bitte nimm diese Kritik nicht persönlich - ich weiß, das klingt alles erstmal relativ hart. Viele andere vor Dir haben genau das selbe implementiert, und da war es schon genau so unsinnig wie in Deinem Beispiel. Grade diese eng an eine Datenbank-Extension gekoppelten Datenbank-Wrapper sind genauso eine Modesünde, wie es Template-Engines mit aufwendiger eigener Syntax lange Zeit waren. Das ist nur eben einfach kein Grund, auf den selben Zug auch auf zu springen, und davon versuch ich halt zu warnen. Gruß Jens |
| | |
| | |
| Erfahrener Benutzer | Also ich denke beim Konstruktor oder der Art und Weise, wie man von einer Konfiguration auf das Anlegen des DB-Verbindungsobjektes kommt, da dürften wir uns einig sein. Das ist schlecht, denn das Beispiel-Script muss folgendes wissen: a) Ich brauche eine MySQL-Verbindung b) Das braucht ein Passwort, einen Hostnamen usw. Was, wenn nun plötzlich mysqli als extension genutzt werden soll und der Server auf einem alternativen Port läuft? Hmmm. Wurde ja schon von meinen Vorgängern erklärt, dass sowas nicht gut ist... Ich selbst kann da beispielsweise das Zend-Framework empfehlen. Dererlei Konzepte, einfach ein Array mitzugeben, was so eins zu eins aus beispielsweise einer Ini-Datei stammt, lässt für jeden Datenbanktreiber genug Spielraum und die Anwendung braucht keinerlei spezialisierte Kenntnisse über die Art der Daten, die der DB-Treiber zum Verbindungsaufbau benötigt. Es ist schlicht und funktioniert wohl auch in Zukunft in nahezu jedem Fall. Also da ja schon zumindest eine Abstraktion vorliegt über ein Interface kann man ja durchaus schon von einem erfüllten Ziel sprechen. Wichtig ist nicht die Innerei der Klasse, sondern der Vertrag, den du mit ihr eingehst. Zu deutsch: Die Methodensignaturen. Und auch wenn du erst einmal wenig Funktionalität mit den Methoden anbietest, ist es doch ein Umstand: Jedes andere Datenbanksystem kann einen Wrapper auf der Basis des Interfaces implementieren. Und damit brauchst du nur noch den Treiber austauschen, in der Anwendung bleibt alles gleich. Der Vorteil gegenüber dem puren Verwenden der DB-Funktionen: Sie sind kompatibel. Einfaches Beispiel: Tausche mal die Datenbank von MySQL auf MsSQL. Du wirst feststellen, dass du mit der Wrapper-Klasse in deiner Anwendung selbst nix ändern musst. Aber die Situation ohne Wrapper: Hattest du vorher die MySQL-Funktionen als OOP selbst verwendet, wirst du nun in der kompletten Anwendung die ganzen Aufrufe auf den MySQL-Verbindungsobjekten und Result-Objekten durch einfache Funktionsaufrufe ersetzen müssen. Bei einem solchen Fall hätte sich der Wrapper bereits bezahlt gemacht beim Aufwand... In meinen Augen haben Wrapper genau deshalb bereits durchaus eine Existenzberechtigung.
__________________ www.php-maven.org PHP und Maven vereint: Build/Deploy/Produktion/Konfiguration, Projekt Management, CI, PHPUnit, zahlreiche Frameworks Twitter @ https://twitter.com/#!/mepeisen und Facebook @ http://t.co/DZnKSUih |
| | |
|
| Themen-Optionen | |
| Thema bewerten | |
|
|
Ähnliche Themen | ||||
| Thema | Autor | Forum | Antworten | Letzter Beitrag |
| MySQL Verbindung zu fremden Server | Xanatus | Datenbanken | 5 | 27.05.2009 14:13 |
| [Erledigt] Kann keine Umlaute im mysql client eingeben | Oger | Datenbanken | 9 | 02.04.2009 11:54 |
| MySQL Konsole und Umlaute unter Windows [LÖSUNG] | f4ckm5 | Datenbanken | 8 | 30.03.2009 22:10 |
| [Erledigt] Eine klasse einbinden | newWorldOrder | PHP Tipps 2009 | 2 | 23.02.2009 19:32 |
| MySQL Klasse | Gödda | PHP Tipps 2009 | 8 | 17.02.2009 01:56 |
| Problem bei Umstellung auf MySQL 5 | bettina | Datenbanken | 13 | 21.01.2009 10:00 |
| tutorial mysql klassen im oop projekt | phpdummi | Beitragsarchiv | 4 | 17.01.2007 20:17 |
| MySQL - Klasse: Wie da mysql_close benutzen | Igäl | PHP Tipps 2006 | 5 | 01.10.2006 23:09 |
| mysql klasse - handling mehrerer connections | mrSpok | PHP Tipps 2006 | 5 | 14.04.2006 01:05 |
| MySQL Server startet nicht mehr richtig... | Datenbanken | 16 | 03.03.2006 19:40 | |
| Kein Zugriff über ODBC mit der IP-Adresse auf MySql DB | Datenbanken | 4 | 09.02.2006 11:04 | |
| [Erledigt] not allowed to connect to this MySQL server | PHP Tipps 2005-2 | 2 | 23.09.2005 18:34 | |
| Suche Tipps für Persormance-Steigerung (Geld für Nützliches) | Beitragsarchiv | 18 | 16.08.2005 10:57 | |
| MYSQL läuft nur wenn /tmp auf 777 | Datenbanken | 5 | 06.07.2005 08:38 | |
| mysql root passwort vergessen | Datenbanken | 1 | 29.05.2005 11:33 | |
| Besucher kamen über folgende Suchanfragen bei Google auf diese Seite |
| php mysql exception, datenverarbeitung mysql, manuel leuchtenmüller google, php mysql exceptions, php datenbank dependency injection, php catch mysqlexception, http://www.php.de/php-fortgeschrittene/56365-ist-so-eine-klasse-fuer-mysql-datenverarbeitung-gut.html, php database dependency injection class, php mysql db wrapper, php oop try catch database, php mysql insert klasse, php einfach datenverarbeitung mysql, exception php mysql, mysql .net datenverarbeitung, php die exception mysql beispiel, php dependency injection mysqli, php class mysql, php mysql classe implementieren, mysql exception, mysqli klasse dependency injection |