Datenbankzugriff in einer Klasse
Torsten
- php
1 Gerhard1 Fabian St.0 Torsten0 Fabian St.0 Torsten
Hallo,
habe soeben eine Klasse für den Zugriff auf MySQL-Datenbanken implementiert. Jetzt würde ich gerne mal von den erfahrenen Programmieren wissen, ab mein Ansatz so in Ordnung ist. Oder ob es vielleicht an manch einer Stelle Verbesserungsvorschläge gibt. Ich bin noch relativ unerfahren, mich würde es sehr freuen wenn sich mein Code jemand mal ansehen und mir zeigen könnte, was ich evtl. schlecht oder gut gemacht habe. Danke...
<?php
class MySQL_db
{
var $resource; // Rückgabewert mysql_connect()
var $db_select; // Rückgabewert mysql_select_db()
var $sql_server;
var $sql_user;
var $sql_password;
var $sql_db_name; // Datenbankname
function MySQL_db($server,$user,$password,$db_name)
{
$this->sql_server = $server;
$this->sql_user = $user;
$this->sql_password = $password;
$this->sql_db_name = $db_name;
$this->resource = @mysql_connect($server,$user,$password);
if(false === $this->resource)
{
//return false;
echo "mysql_connect: ".mysql_error()."<br>";
}
if($this->resource)
{
$this->db_select = @mysql_select_db($this->sql_db_name,$this->resource);
if(false === $this->db_select)
{
//return false;
echo "mysql_select_db: ".mysql_error()."<br>";
}
}
return $this->resource;
}
function sql_close()
{
$close = @mysql_close($this->resource);
if(false === $close)
{
//return flase;
echo "mysql_close ".mysql_error()."<br>";
}
}
function sql_query($sql_query_str)
{
if($this->resource && $this->db_select)
{
$query_result = @mysql_query($sql_query_str);
if(false === $query_result)
{
//return false;
echo "mysql_query: ".mysql_error()."<br>";
}
return $query_result;
}
}
//weitere Methoden
}
?>
Instanziierung:
$db = new MySQL_db('server','user','password','datenbank');
$db->sql_query($sql);
$db->sql_close();
Gruß
Torsten
Ich würde das Öffnen der Verbindung erst in einer Eigenen Funktion open() vornehmen; den Konstruktor würde ich lediglich zum initialisieren der Variablen verwenden
lg gerhard
Hallo Gerhard
Ich würde das Öffnen der Verbindung erst in einer Eigenen Funktion open() vornehmen; den Konstruktor würde ich lediglich zum initialisieren der Variablen verwenden
ok, und mit welcher Begründung, was hat dass für Vorteile oder welche Nachteile ergeben sich bei meiner Methode?
Gruß
Torsten
sorry das hab ich natürlich vergessen
wenn das objekt erzeugt wird kann es sein dass du erst zu einem späteren zeitpunkt im skript die verbindung herstellen willst
möglicherweise möchtest du sie aus irgendeinem grund auch wieder schließen und nochmals öffnen
aber das bleibt natürlich dir überlassen
lg gerhard
sorry das hab ich natürlich vergessen
wenn das objekt erzeugt wird kann es sein dass du erst zu einem späteren zeitpunkt im skript die verbindung herstellen willst
möglicherweise möchtest du sie aus irgendeinem grund auch wieder schließen und nochmals öffnen
aber das bleibt natürlich dir überlassen
lg gerhard
ahh, gut das du das angesprochen hast. Das wäre nämlich meine nächste Frage gewesen.
Meine Datenbankverbindung wird nur für bestimmte Seiten geöffnet. Also würde es Sinn machen, nur einmal das Objekt zu erzeugen, und je nach dem ob die Verbindung nun gebraucht wird oder nicht sie herzustellen? Im Moment ist es so, dass ich für die Seiten wo eine Verbindung gebraucht wird, jedes mal das Objekt neu erzeugt wird. Das scheint nicht besonders gut zu sein, oder?
Gruß
Torsten
doch eigentlich ist das egal
dafür gibt es ja die objektorientierung
lg gerhard
das kommt natürlich auch auf die implementierung deiner website an
verwendest du zum beispiel nur eine index.php und lädst die unterseiten per ?sub=wieauchimmer hinzu dann benötigst du nur ein einziges objekt
das kommt natürlich auch auf die implementierung deiner website an
verwendest du zum beispiel nur eine index.php und lädst die unterseiten per ?sub=wieauchimmer hinzu dann benötigst du nur ein einziges objekt
genau so ist meine Website implementiert.
Jetzt stellt sich wieder für mich die Frage, ob diese Art empfehlenswert ist? In meiner index.php werden unter anderem Klassen und Funktionen includiert. Einige davon nur wenn sie gebraucht werden, andere immer.
Wenn jetzt ein User auf index.php?sub=irgendwas klickt, wird ja die index.php neu geladen und somit werden auch meine Klassen und Funktionen neu includiert. Ich denke das könnte man besser machen, oder was meint ihr?
Dann hätte ich noch eine Literatur Frage, gibt es nicht ein empfehlenswertes Buch, z.b. so was wie, PHP-Websites von Grund auf professionell Entwickeln? Ich hab einfach noch viel zu viele Fragen und möchte euch nicht ständig nerven ;-)
Gruß
Torsten
Moin!
Meine Datenbankverbindung wird nur für bestimmte Seiten geöffnet. Also würde es Sinn machen, nur einmal das Objekt zu erzeugen, und je nach dem ob die Verbindung nun gebraucht wird oder nicht sie herzustellen? Im Moment ist es so, dass ich für die Seiten wo eine Verbindung gebraucht wird, jedes mal das Objekt neu erzeugt wird. Das scheint nicht besonders gut zu sein, oder?
Du kannst keine dauerhaften Objekte herstellen, die durch mehrere Skripte zu unterschiedlichen Zeiten angesprochen werden könnten.
Jeder Skriptaufruf startet erneut mit komplett leerem Speicher, also ohne Variablen und Objekte.
Es würde dir dann einen Vorteil bringen, wenn du nur auf den Seiten, die Datenbankzugriff brauchen, die DB-Klasse überhaupt mit include einzubinden und sonst nicht.
Ansonsten: Da die Klasse offensichtlich nur Datenbankzugriffe leistet, ansonsten aber nutzlos ist, spricht wenig dagegen, mit der Instanziierung des Objektes auch die DB-Verbindung herzustellen. Und da ist es egal, ob das am Beginn, in der Mitte oder am Ende des Skriptes geschieht. Es ist im Gegenteil sogar schädlich, würdest du innerhalb eines Skriptes für jede einzelne Abfrage die DB-Verbindung neu aufbauen und danach wieder schließen.
- Sven Rautenberg
Hi!
habe soeben eine Klasse für den Zugriff auf MySQL-Datenbanken implementiert. Jetzt würde ich gerne mal von den erfahrenen Programmieren wissen, ab mein Ansatz so in Ordnung ist. Oder ob es vielleicht an manch einer Stelle Verbesserungsvorschläge gibt. Ich bin noch relativ unerfahren, mich würde es sehr freuen wenn sich mein Code jemand mal ansehen und mir zeigen könnte, was ich evtl. schlecht oder gut gemacht habe. Danke...
[Datenbank-Klasse]
Im Grunde ist dein Ansatz nicht schlecht, solltest du jedoch PHP5 zur Verfügung haben, würde ich mir noch weitere (OO-)Features zu nutzen machen: Zugriffbarkeit (public, protected, private) der Eigenschaften/Methoden, Exceptions. Insbesondere letztere sind für eine Datenbank-Klasse eine ziemliche sinnvolle Ergänzung, da sich dadurch eventuelle Fehlerbehandlung und -abfrage erheblich vereinfachen lassen.
Außerdem würden sich in diesem Falle auch noch __construct() und __destruct() als PHP5 konforme Konstruktoren und Destruktoren anbieten.
Solltest du jedoch nur PHP4 zur Verfügung haben, so würde ich auf die direkte Ausgabe der Fehler mittels „echo“ verzichten und mir stattdessen ein „Fehler“-Array aufbauen, das am Ende mittels einer zusätzlichen Methode durchlaufen wird.
Grüße,
Fabian St.
Hi,
Im Grunde ist dein Ansatz nicht schlecht, solltest du jedoch PHP5 zur Verfügung haben, würde ich mir noch weitere (OO-)Features zu nutzen machen: Zugriffbarkeit (public, protected, private) der Eigenschaften/Methoden, Exceptions. Insbesondere letztere sind für eine Datenbank-Klasse eine ziemliche sinnvolle Ergänzung, da sich dadurch eventuelle Fehlerbehandlung und -abfrage erheblich vereinfachen lassen.
Außerdem würden sich in diesem Falle auch noch __construct() und __destruct() als PHP5 konforme Konstruktoren und Destruktoren anbieten.
ja, leider hat mein Webprovider noch nicht auf PHP5 upgegradet, warum auch immer, finde ich sehr schade. Vielleicht werde ich auch mein Anbieter wechseln.
Solltest du jedoch nur PHP4 zur Verfügung haben, so würde ich auf die direkte Ausgabe der Fehler mittels „echo“ verzichten und mir stattdessen ein „Fehler“-Array aufbauen, das am Ende mittels einer zusätzlichen Methode durchlaufen wird.
sind echo-Befehle in Funktionen/Methoden generell eher nicht zu empfehlen?
Ich hatte mir für die Fehlerbehandlung folgendes überlegt:
Eine weitere Klasse, z.b. Error-Handling, diese dann an MySQL_db vererbt, und bei Fehlerfall auf Methoden der Error-Handling-Klasse zugreifen. Kann man eigentlich in PHP4 vererben, und wäre das eine gute Idee?
Gruß
Torsten
Hi!
ja, leider hat mein Webprovider noch nicht auf PHP5 upgegradet, warum auch immer, finde ich sehr schade. Vielleicht werde ich auch mein Anbieter wechseln.
Mittlerweile sollten wirklich alle Provider PHP5 anbieten - zumindest parallel neben der 4er Version.
Solltest du jedoch nur PHP4 zur Verfügung haben, so würde ich auf die direkte Ausgabe der Fehler mittels „echo“ verzichten und mir stattdessen ein „Fehler“-Array aufbauen, das am Ende mittels einer zusätzlichen Methode durchlaufen wird.
sind echo-Befehle in Funktionen/Methoden generell eher nicht zu empfehlen?
Ich persönlich vermeide dies soweit es möglich ist, da es mitunter bei größeren Funktionen leicht undurchsichtig wird, woher jetzt diese Meldung kommt, weil diese Funktionen meist in externe Dateien ausgelagert sind und nur bei Bedarf aufgerufen werden.
Ich hatte mir für die Fehlerbehandlung folgendes überlegt:
Eine weitere Klasse, z.b. Error-Handling, diese dann an MySQL_db vererbt, und bei Fehlerfall auf Methoden der Error-Handling-Klasse zugreifen. Kann man eigentlich in PHP4 vererben, und wäre das eine gute Idee?
Vererbung macht in diesem Falle wenig Sinn und ist so, wie du es beschreibst, auch nicht möglich. Der Sinn einer Vererbung besteht darin, einen bestehenden Code zu erweiterten, ohne ihn ändern oder duplizieren zu müssen, d.h. eine Vererbung macht insbesondere dann Sinn, wenn du eine Klasse noch weiter konkretisieren und auf eine ganze spezielle Anwendung spezialisieren möchtest.
Ich würde daher vorschlagen, in deinem Konstruktor eine neue Instanz der Error_Handling-Klasse anzulegen und der DB_MySQL-Klasse eine Methode hinzufügen, die ihrerseits eine öffentliche Methode der Error_Handling-Klasse aufruft und deren Rückgabewert an das eigentliche Script zurückgibt.
Wie du im Manual nachlesen kannst, gibt es bereits unter PHP4 die Möglichkeit, mittels »extends« eine Kindklasse von der Elternklasse abzuleiten (http://de.php.net/manual/de/keyword.extends.php).
Grüße,
Fabian St.
Hi,
Mittlerweile sollten wirklich alle Provider PHP5 anbieten - zumindest parallel neben der 4er Version.
leider nur meiner nicht...
Vererbung macht in diesem Falle wenig Sinn und ist so, wie du es beschreibst, auch nicht möglich. Der Sinn einer Vererbung besteht darin, einen bestehenden Code zu erweiterten, ohne ihn ändern oder duplizieren zu müssen, d.h. eine Vererbung macht insbesondere dann Sinn, wenn du eine Klasse noch weiter konkretisieren und auf eine ganze spezielle Anwendung spezialisieren möchtest.
Ich würde daher vorschlagen, in deinem Konstruktor eine neue Instanz der Error_Handling-Klasse anzulegen und der DB_MySQL-Klasse eine Methode hinzufügen, die ihrerseits eine öffentliche Methode der Error_Handling-Klasse aufruft und deren Rückgabewert an das eigentliche Script zurückgibt.
ah ok, vielen dank für die hilfe!
gruß
torsten