• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

PHP Klassen - Datenbankanbindung

Puccini

Neues Mitglied
Hi,

ich bin grad dabei meine anwendung mit klassen zu versehen.
da das thema neuland für mich ist, sehe ich noch nicht so recht druch.

construt, destruct, privat, public, protected sowie extend versteh ich.

aber jetzt gehts los :D

ich bau am anfang meines PHP-Scritps eine DB-Verbindung auf.
Hierfür hab ich meine Klasse "db_connect".
Das ganze speichre ich in einer Session-Var:
PHP:
$_SESSION['dbcon'] = new db_connect();
Ist das schonmal sinnvoll oder nicht? Weil ich ja die DB-Anbindung in meinen weiteren Klassen brauch, dachte ich, mach ich gleich eine globale variable draus. und damit ich nicht in jeder funktion ein "global $dbcon;" schreiben muss wirds halt ne session-var.

Wenn ich das ganze so lösen würde, das ich jetzt allen weiteren Klassen ein "extends db_connect" mitgebe, bauen doch alle klassen ihre eigene verbindung zur db auf oder? das will ich quasi verhindern.

Aber irgendwie scheint mir meine lösung "falsch"...
Wer hat da einen guten ansatz für mich?
Vielen dank!
 
Du kannst ein Objekt nicht der Session mitgeben. Du müsstest es dafür serialisieren.
Aber in deinem Fall würde ich einfach auf jeder Seite, auf der eine Datenbank Anbindung gebraucht wird ein neues Datenbank Objekt erstellen.
Da Klassen ein wenig neuland für dich sind gebe ich dir den Tipp:
Klassennamen immer groß schreiben.
Außerdem sollte deine Klasse nicht db_connect sein sondern viel mehr Database :)
eine funktion könnte connect heissen.
Nur als Tipp :)

Achso. und wenn du die Klasse innerhalb anderer Klassen brauchst gibt es 2 Möglichkeiten:
Du übergibst ein Datenbank Objekt als Parameter. Oder du erstellst das Datenbank Objekt innerhalb der Klasse.
 
hmm...

danke für die tips.

wenn ich das Objekt überall wo ich es brauche ständig neu erzeuge, ist das doch aber auch blöd oder?
Mach ich doch haufen connects zu der db... (oder werden die da trotzdem persistent behandelt und alle instanzen laufen über den selben connect?)

das mit dem Parameter klingt net schlecht.
Könnte ich da die Referenz auf die Instans übergeben? Also quasi so:

PHP:
$test1 = new Database();
$test2 = new Klasse2($test1);

und in der KLasse2 würde dann stehen:
PHP:
__consturct($DBObjekt){
$this->DB = $DBObjekt;
$this->DB->query(blabla);
:shock:
 
genau so siehts aus wie du es als Beispiel aufgeschrieben hast :)
Würde noch als Typabfrage folgendes machen

PHP:
$database = new MysqlDatabase($daten);
$user = new User($database);


// und die user Klasse fragt dann folgendes noch ab

class User {

private $db;

public function __construct(MysqlDatabase $database) {
   $this->db = $database;
}


}


Er prüft dann ob das Objekt ein Objekt der Klasse MysqlDatabase ist.
 
ah :D

schön. ich hab grad nebenbei noch was über factorys und singletons gelesen.
das scheint auch mein problem zu lösen.
Folgendes hab ich da jetzt mal fix zusammengeklickert:

PHP:
    // Die Singleton Funktion
    public static function connect() 
    {
        if (!isset(self::$instance)) {
            $c = __CLASS__;
            self::$instance = new $c;
        }

        return self::$instance;
    }
    
    private function __construct()
    {
        if(!is_resource($this->db))
        {
            $this->db = @mysql_connect("localhost","root","pass");
            if($this->db)
            {
                echo "neue Verbindung: ".$this->db."<br>";
                $this->dbSelect = @mysql_select_db("datenerfassung");
            }
            else
                $this->dbError = mysql_error($this->db);
        }
    }
das in der DB-Klasse
PHP: Pattern - Manual

Aber deine lösung gefälltmir fast besser.
Werd ich glaube ich auch so machen. Danke!
 
bevor du mit klassen anfängst, würde ich mir erst mal ansehen, wann und wo klassen sinnvoll gebraucht werden.
gerade bei datenbanken (datenbank anbindungen) machen klassen bei abfragen oder zusammenführen von daten sinn, sonst eher nicht.

funktion und klasse verhalten sich wie tabelle und div in html. mal ist das eine mal das andere sinnvoll.

wenn du keine eigenschaften, der einen menge einer anderen, übergeben möchtest (musst) sind klassen ein mehraufwand, der null sinn macht.
 
Vielleicht ist das nur persönliches empfinden, aber ich finde Klassen sind immer sinnvoll. Wenn man auch in Klassen programmiert fällt es einen leichter eine Verbindung zu anderen Programmiersprachen zu finden. Außerdem wird die Anwendung dann in Komponenten eingeteilt. Man sollte probieren sich so weit wie möglich von der strukturierten Programmierung zu entfernen und sich mehr der Objektorientierten Programmierung zu zuwenden. So kann für eine Datenbank auch später noch ein Interface geschrieben werden (Falls man doch eine andere Datenbank benutzt) und die übergeben Klasse benutzt trotzdem noch die selben Befehle. :D Aber ist wohl ne Ansichtssache.

Beispiel für eine Datenbank Klasse: Hab in meiner MysqlDatabase Klasse zum Beispiel auch Logging mit eingebaut und beim select werden die Daten in ein Array geschrieben.
 
du übersiehst, dass, ist eine klasse nicht sauber programmiert, die manipulation erleichert wird.

nahezu alle nennenswerten sql injections zielen auf bestehende klassen, bei funktionen hätten sie seltener eine chance.
 
mal was neues von mir.

ich spiele grad mit dem gedanken meine Datenbankzugriffe zu reduzieren.
Hierfür wollte ich auf den destructur eines Objektes zurückgreifen.

Folgendes Szenario:
Ich erzeuge ein Singelton für ein Objekt wenn ich es das erste mal benutze.
Im construct wird dabei der aktuelle Wert des Objektes aus der DB geholt.
Über die gesamte Laufzeit des PHP-Scripts wird dann keine weitere DB-Abfrage gemacht, alle SET- und GET-Methonden für dieses Objekt greifen auf die Daten des Singeltons zu.

Am Ende der Laufzeit des Scripts wird ja dann automatisch der destruct-Befehl für ein Klassen-Objekt ausgeführt sobald keine Instanz mehr am "leben" ist.
Also schreib ich da dann die aktuellen Daten des Objektes wieder in die DB.
Vielleicht wäre sogar ein Vergleich der Start-End-Daten noch ratsam, so das nur dann geschrieben wird, wenn änderungen vorliegen.

Ist das ratsam oder nicht?
Alle Funktionen würden immer auf das Singelton zugreifen. (Wobei ich innerhalb des Singeltons ein Array an Instanzen hätte, welche zu der jeweiligen OBjekt-ID gehören). z.B. die Klasse "user". Pro User wird dann ein eigenes Singelton erzeugt.

:D danke euch
 
Hi,

das ist auf jeden Fall sinnvoll.
Ich würde aber die Daten nur mit einem expliziten Save speichern da du dadurch auch die Möglichkeit bekommst, Daten zu ändern, und dann doch nicht zu speichern.

Gruß KY
 
hmmm...

das wäre auch ne möglichkeit. aber da die daten ja eh gespeichert werden müssen wenn sie geädnert wurden, kann ich das doch auch so machen (zumindest bei dem großteil meiner funktionen).

Oder, ich mach eine Save-Funktion, speichere aber nicht beim Aufruf der Funktion, sondern setzte nur eine Var auf true. und im destructor schau ich "soll gespeichert werden?" und dann speichere ich.

ich will ja so wenig wie möglich Datenbankzugriffe erzeugen.
Daher schau ich auch schon seit einer weile nach memcache und co.
 
Irgendwie handelt es sich hierbei um ein Verständnisproblem.

Die Datenbankverbindung wird nach jedem Request auf- und abgebaut. Dein Datenbank-Objekt bietet aber nur den Zugang zu deiner Datenbank und gibt nur Daten zurück, speichert diese aber nicht.

Um die Anzahl der Request zu reduzieren kannst musste du so viel wie möglich Cachen und deine Requests optimieren.

Kurz: du müsstest nicht das Datenbank-Objekt serialisieren, sondern die User-Klassen (usw.) und in eine Datei speichern (Session ist da kein guter Platz). Das müsstest du für jeden User machen, was sicher den Cache schnell groß macht.
 
nein, das ist, wie du schon richtig sagst "caching".
Dafür würde ich mir memcache auf dem server installieren. Das regelt das ganze caching.

Was ich hiermit erreichen will ist folgendes:
Der User führt eine Aktion durch
->PHP startet die Verarbeitung der Anfrage
->hierzu muss z.B. die Daten des User geladen werden
->diese Daten werden von verschiedenen Funktionen benötigt und verändert.
->am ende des Verarbeitungs-Scriptes werden die event. geänderten Daten dann wieder in die DB geschrieben.

Mithilfe meiner Instancen und Singletons schaffe ich es, das jede der Funktonen auf das gleiche Objekt (nähmlich den einen User) zugreifen kann ohne jedesmal neu die Daten des Users aus der DB laden zu müssen.
Das dies nur für den einen Aufruf gilt ist mir dabei bewusst.
Um es die ganze Session über so zu machen würde mann diese Daten dann wie du sagtest cachen müssen. Aber soweit bin ich noch nicht.

Ich bin froh wenn ich durch meine Methode den Datenbankzugriff reduzieren kann. Alles weiter kommt noch.
 
Zurück
Oben