Willkommen auf dem Portal für Mediengestalter
|
|
Autor |
Nachricht |
mööp
Threadersteller
Dabei seit: 29.08.2003
Ort: -
Alter: -
Geschlecht: -
|
Verfasst So 19.09.2004 16:23
Titel Klasse für SQL Anweisungen |
|
|
Hallo zusammen,
bin gerade an einem privaten Projekt, wo ich zum ersten mal OOP nutze. Da es mich bisher immer ein wenig angeranzt hat, jede SQL Anweisung neu zu tippen, habe ich mir vorgenommen eine flexible Klasse zu proggen, die das übernimmt. Habe auch was hinbekommen, nun möchte ich aber von etwas erfahreneren Codern mal eine Meinung hören, ob das ganze auch sinnvoll und nützlich ist oder ob es geschicktere Lösungen bereits gibt.
Hier die Klasse mit einer ersten Methode für die immerwiederkehrenden INSERT Anweisungen *g
Code: |
<?php
/*
Klasse für SQL Abfragen/ Anweisungen.
In den jeweiligen Funktionen kann man die benötigten Eigenschaften ablesen.
*/
class my_sql {
// registrieren.php
function my_insert () {
/*
$tabelle Name der Tabelle in die geschrieben werden soll
$spalten Name der Spalte in die geschrieben werden soll, kann auch ein A R R A Y sein
Den Spaltennamen müssen im Array je ein Komma angefügt werden, außer beim letzten Namen.
$werte Inhalt der in Spalte eingefügt werden soll, wenn A R R A Y, dann auf selbe Reihenfolge wie bei spalten achten!
Die Werte müssen im Array so angegeben sein, dass jeder Wert beim auslesen in einfachen Anf.zeichen steht
und durch Komma getrennt sind, beim letzten Wert muss das Komma weggelassen werden.
$erfolg Meldung die bei korrekter Ausführung zurückgegeben wird - Rückgabewert für return
$fehler Meldung die bei einem Datenbankfehler zurückgegeben wird.
$db_connect Datenbankverbindung
Hier ein Beispiel für die Definition der Eigenschaften:
$insert_ob = new my_sql;
$insert_ob->tabelle = 'user';
$insert_ob->spalten = array("name, ","passwort, ","email");
$insert_ob->werte = array("'$username', ","'$passwort', ","'$email'");
$insert_ob->erfolg = 'Vielen Dank für Deine Registrierung. Deine Daten wurden gespeichert.';
$insert_ob->fehler = 'Fehler: Ein Datenbankfehler trat auf. Es wurden keine Daten gespeichert.<br />Bitte versuche es später nochmal.';
$insert_ob->db_connect = $db_connect;
$insert_regdaten = $insert_ob->my_insert();
echo $insert_regdaten; // Gibt Meldung $erfolg oder $fehler aus.
Stand: 19.09.2004
*/
// wenn mehrere Spalten geändert werden sollen - meistens der Fall...
if(is_array($this->spalten)) {
foreach($this->spalten as $spalte) {
$str_spalten .= $spalte;
}
foreach($this->werte as $wert) {
$str_werte .= $wert;
}
$sql = 'INSERT INTO ' . $this->tabelle . ' (' . $str_spalten . ') VALUES (' . $str_werte . ')';
$query = mysql_query($sql, $this->db_connect);
// wenn ein Datenbankfehler auftrat
if($query == FALSE) : return $this->fehler;
endif;
return $this->erfolg;
}
// wenn nur in eine Spalte geschrieben werden soll. Fast nie der Fall...
else {
$sql = 'INSERT INTO ' . $this->tabelle . ' (' . $this->spalten . ') VALUES (' . $this->werte . ')';
$query = mysql_query($sql, $this->db_connect);
// wenn ein Datenbankfehler auftrat
if($query == FALSE) : return $this->fehler;
endif;
return $this->erfolg;
}
} // Ende der Funktion my_insert()
} // Ende der Klasse my_sql
|
Zuletzt bearbeitet von mööp am So 19.09.2004 17:26, insgesamt 5-mal bearbeitet
|
|
|
|
|
Waschbequen
Account gelöscht
Ort: -
|
Verfasst So 19.09.2004 16:40
Titel
|
|
|
Wenn man schon keine Möglichkeit hat, die Logik komplett in der Datenbank abzuwickeln (oder kann MySQL mittlerweile Stored Procedures?), dann sollte man das ganze wenigstens direkt im Code so aufbauen, dass es möglichst schnell verstanden wird. Von dir, wenn du das Zeug in 5 Jahren nochmal anfassen musst, für andere, die mit dir zusammenarbeiten usw. Und da ist sowas imho nicht sehr prickelnd - wenn ich mir vorstelle, ich kriege den Code vorgeschmissen und muss damit arbeiten, dann wäre es um vieles einfacher, wenn ich direkt verstehen könnte, was da passiert...
Und mal davon abgesehen wirst du damit auch nie hundert Prozent deiner Anforderungen erfüllen - bei Joins und Unions geht's ja schon los...
|
|
|
|
|
Anzeige
|
|
|
mööp
Threadersteller
Dabei seit: 29.08.2003
Ort: -
Alter: -
Geschlecht: -
|
Verfasst So 19.09.2004 16:47
Titel
|
|
|
Also ich habe mir bei der Logik des Codes sehr viel Mühe gegeben. Ich denke, wenn man sich damit 5 Minuten intensiv auseinandersetzt und etwas Ahnung hat, dann versteht man den Ablauf ohne Probleme.
Nich umsonst habe ich auch ein Beispiel mit in die Kommentare gepackt. Eigentlich müsste man nur schnell den Code kopieren, seine Daten für Datenbankverbindung raussuchen, eine Tabelle zum Testen anlegen und das Beispiel mit seinen Daten ändern.
PS:
hier hats natürlich kein Syntaxhighlightning, das macht den code natürlich etwas unleserlich. Im Editor blickt man sicher besser durch.
PPS:
Stored Procedures sind ab MySQL 5 möglich.
Zuletzt bearbeitet von mööp am So 19.09.2004 16:49, insgesamt 2-mal bearbeitet
|
|
|
|
|
Waschbequen
Account gelöscht
Ort: -
|
Verfasst So 19.09.2004 18:23
Titel
|
|
|
Ich erkenne dir ja auch deine Leistung nicht ab, kenne ja selber das gute Gefühl, wenn man was nach eigener Ansicht richtig geiles programmiert hat
Ich hab' in meinen Anfängen ähnliche Ansätze gehabt und auch solche Funktionen (mangels vernünftiger KLassenlogik damals in VBScript) gebaut, dann aber sehr schnell in der Praxis gesehen, dass das nicht hinhaut.
Wenn ich mir jetzt meinen Code von vor 3 Jahren anschaue, wo ich eben sowas gemacht habe, dann schlage ich die Hände überm Kopf zusammen - und der Aufwand ist eben um einiges höher das Zeug zu warten, da ich mich jedesmal erst einarbeiten muss.
|
|
|
|
|
Account gelöscht
Ort: -
Alter: -
|
Verfasst So 19.09.2004 20:03
Titel
|
|
|
Ich weiß nicht, ob ich dein Script als praktisch empfinden würde, es kommt mir so ein wenig unflexibel vor, was die Konstruktion auch komplexer sql-Statements angeht. Zum Lernen objektorientierter Programmierung (find ich schöner als das Unwort OOP "proggen" ) ist das Schreiben eine Datenbankklasse aber sicher nicht das schlechteste, daher .
Zitat: | oder ob es geschicktere Lösungen bereits gibt |
Ja, die gibt es, sogar "Datenbankunabhängig":
pear::db
|
|
|
|
|
donnerchen
Dabei seit: 06.04.2003
Ort: -
Alter: 53
Geschlecht:
|
Verfasst So 19.09.2004 20:15
Titel
|
|
|
Hai!
Ich befürchte, dass es wenig Sinn macht eine solche Klasse zu basteln. Man braucht SQL-Befehle ja nun nicht soooo schrecklich oft und dann sind die teilweise doch recht individuell. Soi müsstest Du beim Aufruf einer Methode ja immernoch die Spaltennamen und die Werte angeben. Und da kannst Du auch gleich den ganzen Befehl tippen.
Ganz schwierig wird's dann bei Selects. Wenn Du ein Join oder eine verschachtelte Abfrage bauen willst dann müsste die Klasse schon sehr, sehr flexibel sein...
Neeee, ich glaube das macht keinen echten Sinn
*wink*
|
|
|
|
|
Account gelöscht
Ort: -
Alter: -
|
Verfasst So 19.09.2004 20:33
Titel
|
|
|
bitte!?
natürlich macht das sinn.
Zuletzt bearbeitet von am So 19.09.2004 20:34, insgesamt 1-mal bearbeitet
|
|
|
|
|
donnerchen
Dabei seit: 06.04.2003
Ort: -
Alter: 53
Geschlecht:
|
Verfasst So 19.09.2004 20:38
Titel
|
|
|
Nun, wenn es denn Sinn macht, dann stellt sich die Frage warum es noch niemand als PEAR-Paket implementiert hat.
Das ist einfach zu komplex um es sinnvoll zu bauen. Gerade ein SELECT kann so komplex sein, dass es nicht mit einem vertretbaren Aufwand abgebildet werden kann. Sicher kann man eine verschachtelte Query auf Basis eines endlichen Automatens (Compilerbau) zu implementieren aber der Aufwand ist roß unsd PHP wäre das falsche Tool. Da müsste man schon auf yacc oder so zurückgreifen
|
|
|
|
|
|
|
|
Ähnliche Themen |
if Anweisungen?
[PHP] Falsche If-Anweisungen?
SVG id aktiviert Klasse
[AS2] - Tween-Klasse verwenden
BitmapData Klasse und loadmovie
[CSS] Hover in Css Klasse einfügen ?
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|