Eigene Datenbank-Klasse

Neurodeamon

Erfahrenes Mitglied
Jetzt hab ich mich auch mal ein bissl an PHP-OOP gesetzt. Meine zweite Klasse ist eine Datenbank Klasse für MySQL. Soweit läuft alles ohne Fehlermeldung - irgendwie bekomme ich aber keine Ausgabe hin *schäm*.

Was mache ich falsch, bwz. was könnte ich an der Klasse besser machen?

Damit meine ich jetzt nicht zusätzliche Features - es ist absichtlich nur -> Verbindung, Abfrage, Verbindung beenden <- gedacht. Errorverwaltung folgt, wenn das hier läuft.

Meine erste Klasse war zum lesen/schreiben aus/in eine Datei und das klappte ohne Probleme. Nur mit der Datenbank zoffe ich mich *g* :)

Source als Dateianhang!!!
 

Anhänge

  • class.txt
    838 Bytes · Aufrufe: 84
Schreib das mysql_query mal wie folgt:

PHP:
	function db_mysql_query($db_query)
        {
		if($this->db_cid)
                { 
                $result = mysql_query($db_query,$this->db_cid);
		return mysql_fetch_array($result);
	}

Evtl. würde ich das mysql_fetch_array jedoch in eine weitere Funktion setzen bzgl. dem umgang mit while-Schleifen sonst!
 
Erst mal danke für die ersten Antworten!

@Sebastianus:
Wenn ich das jetzt richtig verstehe:

PHP:
_if($this->db_cid)

Wenn die aktuelle Verbindung geklappt hat, dann erst die Abfrage. Müßte dann nicht bei der Funktion db_mysql_dbselect($db_name) nicht die gleiche if-Abfrage hin?

Das ist doch jetzt aber schon eine Fehlerabfrage, und die wollte ich eigentlich noch net einbauen :p

PHP:
			$result_=_mysql_query($db_query,$this->db_cid);
			return_mysql_fetch_array($result);
Das hier verstehe ich jetzt nicht ganz. Was ist der Unterschied zu meiner Urversion? Könntest Du ein wenig umfangreicher erklären? Warum mysql_fetch_array in eine andere Funktion?

@Valentin:

Danke für das Angebot, aber weitere Klassen werden mir nicht helfen. Ich versuche gerade zu verstehen, wie der ganze OOP-Kram mit Datenbankzeugs funktioniert. Wenn ich soweit bin, komme ich gerne darauf zurück :)
 
-

Hallo!
Ich würde die ganzen Verbindungssachen in den Konstruktor der Klasse reinpacken, damit die gleich initialisiert werden, wenn du eine Instanz der Klasse erstellst.
Außerdem würde ich, wie aber schon gesagt, mysql_fetch_array() in eine weitere Funktion auslagern, da du mit deiner momentanen Version kein komplettes Record Set über mehrere Zeilen ausgeben könntest. Vorallem solltest du vermeiden, von außen auf die Eigenschaften der Klasse zu zugreifen. Das ist ganz böse!!! ;-] Zwar ergibt sich bei PHP dadurch keine all zu große Gefahr, aber man sollte es sich gar nicht erst angewöhnen. Um deine Klasse variabler zu machen, würde ich dir noch raten, die Verbindungsdaten für deine Datenbank an den Konstruktor zu übergeben und nicht schon in der Klasse direkt anzugeben.
So das sollte es erstmal gewesen sein. ;)

P.S. Wenn es sich um so wenig PHP Code handelt, kannst du ihn ruhig direkt hier im Board posten. :)
 
Ich habe gerade Schwierigkeiten dem ganz zu folgen. Kennt Ihr das, wenn Ihr jeden einzelnen Teil versteht, aber die Gesamtheit nicht? :(

Ich habe noch ein wenig daran herumgebastelt, aber jede Klasse die ich mir mal angeschaut habe unterscheidet sich von den anderen obwohl sie das gleiche tun soll...

Klasse:

PHP:
<?php
// database class
class db_mysql{
	// connection vars
	var $db_host = "localhost";
	var $db_user = "root";
	var $db_pw   = "";
	// more important vars
	var $db_cid;
	var $result;
	var $resnum; // noch nicht nötig
	function db_mysql_connect(){
		$this->db_cid = mysql_connect($this->db_host, $this->db_user, $this->db_pw);
	}
	function db_mysql_dbselect($db_name){
		$this->db_name = $db_name;
		mysql_select_db($this->db_name);
	}
	function db_mysql_query($db_query){
		$this->db_query = $db_query;
		$this->query = mysql_query($this->db_query,$this->db_cid);
		/*if(substr($query, 0,6) == "SELECT") $this->resnum = mysql_num_rows($this->result);*/
		$this->result = mysql_fetch_array($this->query, MYSQL_BOTH);
		return $this->result;
	}
	function db_mysql_close(){
		mysql_close($this->db_cid);
	}
}

?>

Instanz:

PHP:
$dabatext = new db_mysql();
$dabatext->db_mysql_connect();
$dabatext->db_mysql_dbselect("default");
$dabatext->db_mysql_query("SELECT * FROM `classtabletest` ORDER BY id ASC");
$dabatext->db_mysql_close();
print_r($dabatext->result);

Könnte mir jemand mit diese Zeilen so hinbiegen wie es 100%ig richtig ist? Es geht nicht darum, das ich eine Klasse brauchen würde, sondern darum das ich alles richtig verstehe. Diese Klasse und Instanzierung hier ist die Summe aller mir bisher vorgeworfenen Happen, die ich mir mit Lektüre von php.net und einigen Beispiel-Klassen zusammengeschustert habe.

@Caminus:
Wenn ich jetzt die Verbindungsdaten alle in den Konstruktor reinpacke, dann kann ich sie ja während des Aufrufens definieren (also so flexibel wie möglich halten), oder? Aber wie?

Ich habe auch schon gemerkt, das ich kein komplettes record set über mehrere Zeilen bekomme (ist im Moment nur eine Zeile, oder?).

Wie mache ich es denn anders, wenn ich hier momentan von aussen auf die Eigenschaften zugreife?

Sorry, aber im Moment schwirrt mir echt die Rübe. Ich brauche doch nur ein richtiges Beispiel aus meinen Zeilen, damit ich vergleichen - und somit auch verstehen kann. :confused:
 
Zuletzt bearbeitet:
Huhu! , das halt ich für zu umständlich , ich habs bei meiner klasse wenn ich caminus seins richtig gelesen hab so ähnlich gemacht

ich hab n kontrucktor der die daten für die klasse speichert und danach bei jedem befehl damit die verbindung nicht dauerhaft an ist eine extra klasse die verbindet und true zurückliefert , das kann ich dann bei jeder sache überprüfn und am ende der function mit ner easy close funktion das ganze wider beenden spart meiner meinung nach zeit , zumindestens denk ich das immer , oder es kommt mir so vor :)

hier n ausschnitt
PHP:
  function insert($tabele,$feld,$werte){
    if($this->connect()){

so denk ich mal is es auch net schlecht :)
 
Ich glaub ich schreib Suaheli oder so... irgendwie hab' ich das Gefühl, das mich keiner versteht.

Es ist ja auch echt toll, das Ihr mir Verbesserungsvorschläge macht, was ich denn noch alles in die Klasse reintun soll, aber das will ich ja gar nicht - zumindest im Moment nicht.

Die Klasse - so wie sie ist - habe ich zum laufen bekommen. Ich will doch nur wissen ob das Vorhandene so richtig ist, und wenn nicht, wie es richtig wäre (mit sichtbarem Beispiel).

Nicht besser, oder mehr oder anders - sondern einfach nur: richtig <-> falsch.

Die Klasse soll im Moment nur eine Verbindung herstellen, der Verbindung die ID zuweisen, Daten über den Query holen oder einfügen und dann die Verbindung mit der gleichen ID wieder schließen.

Im Moment bekomme ich auch nur eine Zeile aus der Tabelle, aber das kommt wie die anderen Probleme erst dran, wenn ich die Klasse grundlegend verstanden habe.

Mehr will ich doch gar nicht ...... *verzweifel*
 
Zuletzt bearbeitet:
-

Hi Neuro!
Solange die Klasse funktioniert, hast du schon mal nichts falsch gemacht. :) Allerdings kann man noch ne Menge verbessern.
Ich geh einfach mal die einzelnen Methoden durch und versuche dir ein paar Ansatzpunkte zur Verbesserung zu zeigen.

PHP:
<?php

// database class

class db_mysql{

    // connection vars

    var $db_host;
    var $db_user;
    var $db_pw;
    var $db_name;

    // more important vars

    var $db_cid;
    var $result;
    var $resnum; // noch nicht nötig

    function db_mysql( $host, $user, $pw, $name ) {
        $this->db_host = $host;
        $this->db_user = $user;
        $this->db_pw = $pw;
        $this->db_name = $name;
        
        $this->db_mysql_connect();
    }
    function db_mysql_connect(){

        $this->db_cid = mysql_connect($this->db_host, $this->db_user, $this->db_pw);
         mysql_select_db($this->db_name, $this->db_cid);
    }
Hier siehst du, dass der Konstruktor so deklariert wurde, sämtliche Daten zu übernehmen und die Klasseneigenschaften zu initialisieren.
Der Konstruktor ruft dann gleich die Methode db_mysql_connect() auf, damit die Verbindung zur Datenbank hergestellt wird. Somit sparst du dir schon
mal 3 Aufrufe aus dem Hauptprogramm, da alles über den Konstruktor geregelt wird.

PHP:
    function db_mysql_query($db_query){

        return mysql_query($db_query,$this->db_cid);

        }
Nach dem Abschicken eines Querys würde ich mir die Resourcen ID als Rückgabewert ans Hauptprogramm übergeben lassen und von da aus eine weitere
Methode, db_mysql_fetch_array oder ähnliches, abhängig vom Record Set in einer Schleife oder nur einfach, aufrufen.

PHP:
       function db_mysql_close(){

        mysql_close($this->db_cid);

    }
Ein expliziter Aufruf der Methode db_mysql_close() ist nicht nötig, da sämtliche offenen Streams am Scriptende automatisch geschlossen werden.
Sieht zwar sauberer aus, ist aber nicht notwendig.
PHP:
$db = new db_mysql("Server", "User", "Passwort", "Datenbankname");
Mit Erzeugung des Objekts besteht eine Verbindung zur Datenbank, die auf Querys wartet.


So, ich hoffe, ich habe dir ein bisschen helfen können, falls nicht, einfach noch mal in Suaheli erklären ;-]
 
Zuletzt bearbeitet:
Jaaaah!!! :) :) :) :)

Genau das meinte ich!!!

Danggee!! Und nein, ich frage nicht nochmal in Suaheli, denn Du hast auch in Suaheli geantwortet und ich hab kein Wort verstanden ;-]
 
Zurück