Community

9dots.de Webdesign Board

 

 FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen   RegistrierenRegistrieren 

 ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin 


mix:db-Klasse v1 - PHP & MySQL
Gehe zu Seite 1, 2  Weiter
 
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    9dots.de Webdesign Community Foren-Übersicht -> Coding-Tutorials
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
lennART h.
Mitglied
Mitglied


Angemeldet: 13.04.2006
Beiträge: 75
Wohnort: Kiel

BeitragVerfasst am: 13.04.2006, 20:17    Titel: mix:db-Klasse v1 - PHP & MySQL Antworten mit Zitat
Hallo,

ich habe vorkurzem mal eine Klasse geschrieben, mit der ich die Fehlerfindung und auch die Übersichtlichkeit im Code, was die Datenbankzugriff angeht, verbessern wollte. Zwar spielt hier eher der erste Punkt die wesentlichere Rolle, doch denke ich, dass mir das in diesem Fall recht gut gelungen ist.

Hauptpunkt warum ich diesen Script gebastelt habe, liegt wohl bei der reinen Übungssache.

Kritik und auch Verbesserungstipps sind, falls vorhanden, gerne gesehen. Auch dankbar bin ich über das Melden vorhander Bugs. Winken

Code:
<?php

class db {

   var $db_server = ''; // Datenbank-Server
   var $db_user = ''; // Benutzername
   var $db_passwort = ''; // Datenbank-Passwort
   var $db_select = ''; // Datenbank-Name


   var $db_link_id = 0;
   var $db_query_id = 0;

   var $db_record = array();
   var $method;

   var $db_show_error = 1; // 0 = Fehler werden mit '<!--' und '-->' eingeklammert
   var $db_show_method = 0; // 1 = Zeige benutze Methode


   /* ### Verbindung zur Datenbank herstellen ###
   # $database: Datenbank-Name, falls von eigentlicher Eingabe abweichend. (optional)
   */
   function db($database = '') {
      $this->method = __METHOD__;
      switch(TRUE) {
         case($this->db_server == ''): $this->error('Sie haben keinen Datenbank-Server angegeben.');
         case($this->db_user == ''): $this->error('Sie haben keinen Benutzer angegeben.');
         // case($this->db_passwort == ''): $this->error('Sie haben kein Passwort angegeben.'); (optional)
         case($this->db_select == ''): $this->error('Sie haben keinen Datenbank-Namen angegeben.');
      }
      $this->db_link_id = @mysql_connect($this->db_server, $this->db_user, $this->db_passwort);
      if(!$this->db_link_id)
         $this->error('Es konnte kein Verbindung zum Datenbank-Server hergestellt werden.', '');
      if($database != '') $this->db_select = $database;
      if(!@mysql_select_db($this->db_select, $this->db_link_id))
         $this->error('Die Datenbank "'.$this->db_select.'" ist nicht vorhanden.', '', $this->method);
   }

   /* ### Anfrage an Datenbank senden ###
   # $sql_string: MySQL-Abfrage
   # $line: Line, in der Abfrage stattfindet. (optional)
   # $file: Datei, in der Abfrage stattfindet. (optional)
   # $limit: Anzahl der Auszugebenden Datenbankreihen. (optional)
   # $offset: Angabe, von welcher Datenbankreihe an gelesen werden soll. (optional)
   # $showerror: 1 = Fehler anzeige,
   #             0 = Fehler nicht anzeigen.
   #             (optional)
   */
   function query($sql_string, $line = '', $file = '', $limit = 0, $offset = 0, $showerror = 1) {
      $this->method = __METHOD__;
      if($limit != 0) $sql_string .= " LIMIT $offset, $limit";
      $this->db_query_id = @mysql_query($sql_string, $this->db_link_id);
      if(!$this->db_query_id && $showerror == 1)
         $this->error('Die Abfrage "'.$sql_string.'" konnte nicht ausgef&uuml;hrt werden.', $line, $file, mysql_error());
      return $this->db_query_id;
   }

   /* ### Datensaetze ausgeben ###
   # $query_id: Verbindungs-Kennung. (Standart: In Klasse aktive Verbindungs-Kennung)
   # $type: MYSQL_BOTH = Array mit assoziativen und numerischen Indizes,
   #        MYSQL_ASSOC = Array mit assoziativen Indizes,
   #        MYSQL_NUM = Array mit numerischen Indizes.
   #        (Standart: MYSQL_BOTH)
   */
   function fetch_array($query_id = -1, $type = MYSQL_BOTH) {
      if($query_id != -1) $this->db_query_id = $query_id;
      if($type == MYSQL_BOTH) $this->db_record = mysql_fetch_array($this->db_query_id);
      elseif($type == MYSQL_ASSOC) $this->db_record = mysql_fetch_assoc($this->db_query_id);
      elseif($type == MYSQL_NUM) $this->db_record = mysql_fetch_row($this->db_query_id);
      return $this->db_record;
   }

   /* ### auszugebene Datensaetze zaehlen ###
   # $query_id: Verbindungs-Kennung. (Standart: In Klasse aktive Verbindungs-Kennung)
   */
   function num_rows($query_id = -1) {

      if ($query_id != -1) $this->db_query_id = $query_id;

      return mysql_num_rows($this->db_query_id);

   }

   /* ### Fehlerausgabe ###
   # $error: Fehlermeldung
   # $line: S.o. (optional)
   # $method: Benutze Methode (optional)
   # $file: S.o. (optional)
   # $sql_error: MySQL-Fehlerausgabe (optional)
   */
   function error($error, $line = '', $file = '', $sql_error = '') {
      echo (($this->db_show_error == 0) ? ('<!--') : (''))
         ."<span style=\"font-family: Verdana, Helvetica, Tahoma; font-size: 12px\"><b>MySQL-Fehler</b><br />\n<br />\n$error<br />("
         ."<b>File:</b> ".(($file != '') ? ("\"$file\"") : ('-'))
         .", <b>Line:</b> ".(($line != '') ? ("\"$line\"") : ('-'))
         .(($this->db_show_method == 1 && $this->method != '') ? (", <b>Method:</b> \"".$this->method."\"") : ('')).")"
         .(($sql_error != '') ? ("<br />\n<br />\n<b>MySQL gab folgenden Fehler aus:</b>\n<br />$sql_error.") : ('')).'</span>'
         .(($this->db_show_error == 0) ? ('-->') : (''));
      exit;
   }
}

?>


Die Klasse darf frei genutzt werden. Besitzt folglich also kein Copyright etc.

Sollte es noch Fragen zur Anwendung der Klasse geben, stehe ich in diesem Thread für Hilfe gerne zur Verfügung.

MfG. lennART h.


Zuletzt bearbeitet von lennART h. am 14.04.2006, 00:06, insgesamt einmal bearbeitet
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
elite
Mitglied
Mitglied


Angemeldet: 20.07.2004
Beiträge: 1005

Interessen: Coding, DLRG, Radsport

BeitragVerfasst am: 13.04.2006, 21:57    Titel: Antworten mit Zitat
Ich hab kein Plan von Klassen und deshalb werd ich mir die morgen ma zu Gemüte führen. Vielleicht krieg ich dann mal mehr Durchblick von der Materie, was mir bis jetzt noch nich gelungen is ^^
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
lennART h.
Mitglied
Mitglied


Angemeldet: 13.04.2006
Beiträge: 75
Wohnort: Kiel

BeitragVerfasst am: 13.04.2006, 23:18    Titel: Antworten mit Zitat
Falls du da noch Fragen zu haben solltest dann, frag ruhig. Soweit es die Klasse betrifft bzw. das Thema Klassen und auch nicht eine absolute Grundlagenfrage ist, stelle ich mein Wissen gerne zur Verfügung.

Eventuell findest du oder jemand anderes dann auch noch Punkte, die sich verbessern lassen etc.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Yada
Mitglied
Mitglied


Angemeldet: 08.06.2004
Beiträge: 267

Interessen: zuviel

BeitragVerfasst am: 13.04.2006, 23:56    Titel: Antworten mit Zitat
Is ja mega umständlich und kompliziert. Meine SQL-Klasse is nur halb so kompliziert Neutral

e/ Aber bei genauerem hinsehen sieht man, dass die Klasse auch was kann Smilie ...

Nice, aber nix für Anfänger / Amateure Winken

e2/ Insert, Update & Delete hättest noch einbauen können...
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
lennART h.
Mitglied
Mitglied


Angemeldet: 13.04.2006
Beiträge: 75
Wohnort: Kiel

BeitragVerfasst am: 14.04.2006, 00:05    Titel: Antworten mit Zitat
Durch aus wahr. Doch werden solche Befehle ja üblicher Weise mit den üblichen MySQL-Befehlen gelöst.

Nun kommt es drauf an, ob man lieber weiterhin, wenn man mit der Klasse arbeitet, die MySQL-Befehle benutzen mag oder sich das ganze so vereinfacht, dass man lediglich die entsprechenden Befehle als Attribute einer Funktion benutzt, wenn du verstehtst, was ich meine.

Mir war es lieber, weiterhin auf die üblichen MySQL-Befehle zu bauen, vorallem weil ich meine alten Scripte darauf umstellen wollte und eigentlich auch musste oder immer noch muss. Da hab ich dann nur den eigentlich immer gleichen Befehl "LIMIT" durch Angaben über die Funktion erledigt.

Dennoch danke für dein Comment. Winken
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Yada
Mitglied
Mitglied


Angemeldet: 08.06.2004
Beiträge: 267

Interessen: zuviel

BeitragVerfasst am: 14.04.2006, 10:00    Titel: Antworten mit Zitat
Klar, selektierungen mach ich auch immer mit 0815 query-Funktionen - aber inserts, updates & deletes gehen über eine Funktion wesentlich schneller...

Code:
query("INSERT INTO `test` (`text`) VALUES ('bla')");


Ist doch viel mehr Arbeit als...

Code:
insert('test',array('text'=>'bla'));


Und bei großen Inserts erpsart einem das eine Menge Arbeit ;D
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xaan
Mitglied
Mitglied


Angemeldet: 19.04.2005
Beiträge: 370
Wohnort: Bayern
Interessen: C#, C++, PHP, Security

BeitragVerfasst am: 14.04.2006, 11:27    Titel: Antworten mit Zitat
die klasse ist wirklich gut druchdacht nix zu bemängelen.

was ich bei meiner noch eingebaut habe is ne zeitmessung und ein counter für jedes query

in etwa so:
Code:

   function query($query, $debug = FALSE) {
      $this->used_querys++;
      $this->affected_rows = 0;

      $mtime_count = get_mtime_counter();

      if(!$this->raw_data = mysql_query($query)) {
         if($debug == TRUE) {
            echo "<br />MySQL Error: ".mysql_error()."<br />";
         }
         return FALSE;
      }
      else {
         $this->query_time += get_mtime_counter()-$mtime_count;
         $this->affected_rows = mysql_affected_rows();
         $this->insert_id = mysql_insert_id();
      }

      return TRUE;
   }



Code:

function get_mtime_counter() {
   $mtime = explode(" ",microtime());
   return $mtime[1] + $mtime[0];
}



@ elite

elite hat folgendes geschrieben:
Ich hab kein Plan von Klassen und deshalb werd ich mir die morgen ma zu Gemüte führen. Vielleicht krieg ich dann mal mehr Durchblick von der Materie, was mir bis jetzt noch nich gelungen is ^^


du hast dein cms ohne klassen programmiert? Denken
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name
lennART h.
Mitglied
Mitglied


Angemeldet: 13.04.2006
Beiträge: 75
Wohnort: Kiel

BeitragVerfasst am: 14.04.2006, 11:33    Titel: Antworten mit Zitat
@ Yada: Das ist allerdings wirklich einfacher. Schöne Idee, werde ich, wenn du nichts dagegen hast, in einer erweiterten Funktion in die nächste Version der Klasse dazuschreiben. Danke dir.

@ xaan: Nette Idee. Werde mal schaun, dass ich vielleicht auch diese Funktion ähnlich noch dazuschreiben werde. Danke auch dir.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Yada
Mitglied
Mitglied


Angemeldet: 08.06.2004
Beiträge: 267

Interessen: zuviel

BeitragVerfasst am: 14.04.2006, 12:37    Titel: Antworten mit Zitat
lennART h. hat folgendes geschrieben:
@ Yada: Das ist allerdings wirklich einfacher. Schöne Idee, werde ich, wenn du nichts dagegen hast, in einer erweiterten Funktion in die nächste Version der Klasse dazuschreiben. Danke dir.

@ xaan: Nette Idee. Werde mal schaun, dass ich vielleicht auch diese Funktion ähnlich noch dazuschreiben werde. Danke auch dir.


Ausschnitt meiner Klasse:

Code:
// Fügt einen Eintrag in die Datenbank ein
   function insert($table,$values) {
      $inserts = "";
      $cats = "";
      $counter = 1;
      $countvalues = count($values);
      foreach($values as $cat=>$value) {
         $cats .= "`".$cat."`";
         if($counter!=$countvalues) $cats .= ", ";
         $inserts .= $this->clean_value("'".$value."'");
         if($counter!=$countvalues) $inserts .= ", ";
         $counter += 1;
      }
      
      $this->inserts+1;

      return $this->query("INSERT INTO `".$table."` (".$cats.") VALUES (".$inserts.")");
   }


Funktioniert einwandfrei ;D Kannst auch gern verwenden wenn du willst =) (nur musst halt die Funktionen wie clean_value etc. basteln Winken )

e/ Wobei das ganze auch schon etwas älter ist, und daher nicht gerade high technology Auf den Arm nehmen ... fällt mir grad so auf ^^

e2/ @xaan: Bringt sich was? Außer das es performance zieht Smilie ? Naja, wers braucht und wissen will wie schnell seine Page nen Query ausführt - recht lustig - aber für Uninteressierte is das viel zu umständlich ;P
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
lennART h.
Mitglied
Mitglied


Angemeldet: 13.04.2006
Beiträge: 75
Wohnort: Kiel

BeitragVerfasst am: 14.04.2006, 12:46    Titel: Antworten mit Zitat
Jo, danke für das Angebot. Werde mir die Idee wie gesagt mal in absehbarer Zeit zur Gemüte führen. Ich hoffe, dass ich dann auch bald eine neue Version veröffentlichen kann.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
elite
Mitglied
Mitglied


Angemeldet: 20.07.2004
Beiträge: 1005

Interessen: Coding, DLRG, Radsport

BeitragVerfasst am: 15.04.2006, 14:29    Titel: Antworten mit Zitat
jap hab ich. Hab mit dem CMS auch schon vor 1 1/2 Jahren angefangen und da wusste ich noch nichmal was von Klassen in PHP und nunja bis jetzt bin ich auch ohne ausgekommen!
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
xaan
Mitglied
Mitglied


Angemeldet: 19.04.2005
Beiträge: 370
Wohnort: Bayern
Interessen: C#, C++, PHP, Security

BeitragVerfasst am: 15.04.2006, 15:16    Titel: Antworten mit Zitat
jop so gings mir auch mal mit nem forum.. dann hab ich ewig nix gemacht und mir den code später mal wieder angeschaut als ich erfahrung mit klassen hatte, und fand ihn total uneffizient Mit den Augen rollen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen AIM-Name
Thomas`tiweb
Mitglied
Mitglied


Angemeldet: 03.08.2004
Beiträge: 115
Wohnort: Bruchsal

BeitragVerfasst am: 18.04.2006, 00:57    Titel: Antworten mit Zitat
Hiho - meld mich hier auch mal wieder Smilie

Benutzt ne DB Klasse! Das ist nicht nur wegen der Einfachheit/Uebersichtlichkeit dumm dahergeredet, sondern hat spaeter evtl. sehr gute Folgen (z.b. bei der Umstellung auf eine andere Datenbank oder Sicherheitsabfragen/Funktionen, welche ihr vor/nach einem Query ausfuehren muesst.

Falls ihr an der Page entwickelt: Einen Debug Modus einfuehren, indem ihr mit z.b. gesetztem GET-Parameter eine Liste aller Queries bekommt (incl. Ausfuehrungszeit, Query, Fehler, etc) - das hilft ENORM, beim Fehlerfinden und beim Performance-Ueberwachen, etc

Solche INSERT/UPDATE etc Funktionen lassen sich auch wunderbar mit vorhandenen Klassen (z.b. News) verbinden. Einen kleinen Haken hat jedoch das "Faulsein": Falls ihr besondere Query Befehle braucht (z.b. SELECT DISTINCT, oder solche Sachen), dann braucht ihr entweder ne neue Funktion oder muesst doch wieder auf die query-Funktion zugreifen.
Und natuerlich muss man das Array wieder durchlaufen (Schleife) und nen Query draus bauen -> Bei einem Query ist das egal, aber bei 100Querys pro Seite sind das vielleicht 1000 Schleifendurchlaeufe und recht viele String-Funktionen, die man sich haette sparen koennen Auf den Arm nehmen

PS: Man kann auch ohne Objekte (=Klassenfunktionen) arbeiten, dass sieht dann so aus:
Code:
DB::query(MEINQUERY);
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
lennART h.
Mitglied
Mitglied


Angemeldet: 13.04.2006
Beiträge: 75
Wohnort: Kiel

BeitragVerfasst am: 18.04.2006, 11:07    Titel: Antworten mit Zitat
Danke dir, für den kleinen Kurs. Du hast recht, dass solche Debuggin-Funktionen echt enorm hilfreich sein könnten. Werd mich mal drann setzen, wenn ich wieder mehr Zeit hab.
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
elite
Mitglied
Mitglied


Angemeldet: 20.07.2004
Beiträge: 1005

Interessen: Coding, DLRG, Radsport

BeitragVerfasst am: 21.05.2006, 18:42    Titel: Antworten mit Zitat
So hab nun auch mal meine eigene Datenbank-Klasse programmiert. Funktioniert auch wunderbar, nur hab ich jetzt eine Frage: Wie krieg ich das darein, dass ich nach dem Mysql-Query auch mit
Code:
if(mysql_num_rows()){
überprüfen kann ob Datensätze da sind und dann in der else-Bedingung z.b. echo "Keine Daten" ausgeben kann.

Hier nen Auszug aus meiner Klasse:

Code:

function query($sql)
{
   if(!$this->res = mysql_query($sql, $this->con)) {
    die("Fehler beim Ausf&uuml;hren des Querys: ".mysql_error()."<br>");
   }
}

function fetch_array()
{
$row = mysql_fetch_array($this->res, MYSQL_BOTH);
if(!is_array($row)) {
    return false;
} else {
return $row;   
}

}
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden Website dieses Benutzers besuchen
Beiträge der letzten Zeit anzeigen:   
Dieses Forum ist gesperrt, du kannst keine Beiträge editieren, schreiben oder beantworten.   Dieses Thema ist gesperrt, du kannst keine Beiträge editieren oder beantworten.    9dots.de Webdesign Community Foren-Übersicht -> Coding-Tutorials Alle Zeiten sind GMT + 1 Stunde
Gehe zu Seite 1, 2  Weiter
Seite 1 von 2

 
Gehe zu:  
Du kannst keine Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum nicht antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.

Board Software by phpBB © 2001, 2005 phpBB Group. Impressum
Dominik Wuttke - Moritz Münchmeyer - Joachim Nagel GbR.
AGB