|
|
|
Community
9dots.de Webdesign Board
|
|
|
|
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
lennART h. Mitglied
Angemeldet: 13.04.2006 Beiträge: 75 Wohnort: Kiel
|
Verfasst am: 13.04.2006, 21:17 Titel:
mix:db-Klasse v1 - PHP & MySQL |
|
|
|
|
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.
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ü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, 01:06, insgesamt einmal bearbeitet |
|
Nach oben |
|
|
elite Mitglied
Angemeldet: 20.07.2004 Beiträge: 1005
Interessen: Coding, DLRG, Radsport
|
Verfasst am: 13.04.2006, 22:57 Titel:
|
|
|
|
|
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 |
|
|
lennART h. Mitglied
Angemeldet: 13.04.2006 Beiträge: 75 Wohnort: Kiel
|
Verfasst am: 14.04.2006, 00:18 Titel:
|
|
|
|
|
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 |
|
|
Yada Mitglied
Angemeldet: 08.06.2004 Beiträge: 267
Interessen: zuviel
|
Verfasst am: 14.04.2006, 00:56 Titel:
|
|
|
|
|
Is ja mega umständlich und kompliziert. Meine SQL-Klasse is nur halb so kompliziert
e/ Aber bei genauerem hinsehen sieht man, dass die Klasse auch was kann ...
Nice, aber nix für Anfänger / Amateure
e2/ Insert, Update & Delete hättest noch einbauen können... |
|
Nach oben |
|
|
lennART h. Mitglied
Angemeldet: 13.04.2006 Beiträge: 75 Wohnort: Kiel
|
Verfasst am: 14.04.2006, 01:05 Titel:
|
|
|
|
|
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. |
|
Nach oben |
|
|
Yada Mitglied
Angemeldet: 08.06.2004 Beiträge: 267
Interessen: zuviel
|
Verfasst am: 14.04.2006, 11:00 Titel:
|
|
|
|
|
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 |
|
|
xaan Mitglied
Angemeldet: 19.04.2005 Beiträge: 370 Wohnort: Bayern Interessen: C#, C++, PHP, Security
|
Verfasst am: 14.04.2006, 12:27 Titel:
|
|
|
|
|
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? |
|
Nach oben |
|
|
lennART h. Mitglied
Angemeldet: 13.04.2006 Beiträge: 75 Wohnort: Kiel
|
Verfasst am: 14.04.2006, 12:33 Titel:
|
|
|
|
|
@ 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 |
|
|
Yada Mitglied
Angemeldet: 08.06.2004 Beiträge: 267
Interessen: zuviel
|
Verfasst am: 14.04.2006, 13:37 Titel:
|
|
|
|
|
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 )
e/ Wobei das ganze auch schon etwas älter ist, und daher nicht gerade high technology ... fällt mir grad so auf ^^
e2/ @xaan: Bringt sich was? Außer das es performance zieht ? 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 |
|
|
lennART h. Mitglied
Angemeldet: 13.04.2006 Beiträge: 75 Wohnort: Kiel
|
Verfasst am: 14.04.2006, 13:46 Titel:
|
|
|
|
|
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 |
|
|
elite Mitglied
Angemeldet: 20.07.2004 Beiträge: 1005
Interessen: Coding, DLRG, Radsport
|
Verfasst am: 15.04.2006, 15:29 Titel:
|
|
|
|
|
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 |
|
|
xaan Mitglied
Angemeldet: 19.04.2005 Beiträge: 370 Wohnort: Bayern Interessen: C#, C++, PHP, Security
|
Verfasst am: 15.04.2006, 16:16 Titel:
|
|
|
|
|
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 |
|
Nach oben |
|
|
Thomas`tiweb Mitglied
Angemeldet: 03.08.2004 Beiträge: 115 Wohnort: Bruchsal
|
Verfasst am: 18.04.2006, 01:57 Titel:
|
|
|
|
|
Hiho - meld mich hier auch mal wieder
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
PS: Man kann auch ohne Objekte (=Klassenfunktionen) arbeiten, dass sieht dann so aus: Code: | DB::query(MEINQUERY); |
|
|
Nach oben |
|
|
lennART h. Mitglied
Angemeldet: 13.04.2006 Beiträge: 75 Wohnort: Kiel
|
Verfasst am: 18.04.2006, 12:07 Titel:
|
|
|
|
|
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 |
|
|
elite Mitglied
Angemeldet: 20.07.2004 Beiträge: 1005
Interessen: Coding, DLRG, Radsport
|
Verfasst am: 21.05.2006, 19:42 Titel:
|
|
|
|
|
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ü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 |
|
|
|
|
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.
|
|
|
|
|
|