Zentrale Funktion für DB Zugiff - Macht das Sinn?
Markus
- php
Hallo,
mein Webauftritt umfaßt mittlerweile eine Vielzahl von Seiten und Funktionen. Im Rahmen dieser Ausweitung hat auch die Anzahl der Datenbankzugriffe stark zugenommen. Den Großteil dieser Zugriffe möchte ich gerne zentralisieren, d.h.:
Eine ausgelagerte PHP-Funktion soll 90% aller DB Zugriffe steuern. Lediglich Spezialfälle (wie 'join', etc.) sollen nicht berücksichtigt werden.
Der Funktion möchte ich einfach nur den Tabellennamen, die Felder und den Vergleichsoperator ("Where") übergeben.
Zurückbekommen möchte ich dann, gefüllte Variablen (Name = Feldname)
Macht so etwas Sinn? Habt jemand so was schon gemacht und kann mir zur Ideenfindung mal sein Script zeigen?
Danke, Markus
Hello Markus,
Der Funktion möchte ich einfach nur den Tabellennamen, die Felder und den Vergleichsoperator ("Where") übergeben.
Zurückbekommen möchte ich dann, gefüllte Variablen (Name = Feldname)
sowas haben ganz viele DBMS-Entwickler (also die, die die Basissysteme erfinden) schon x-mal durchdacht. Beschäftige Dich auf jeden Fall mit den Gedanken zu Triggers und Stored Procedures, sowie Transaction-Contol, Rollback, Common und Locking-Strategien, bevor Die deine ganz bestimmt sinnvolle zentrale Zugriffs-API aufbaust.
Wichtig dabei sit, dass sich ALLE Deine Applikationen dann dieser Schnittstelle bedienen.
Dann kann es auch sinnvoll sein, eine zentrale Beschreibungs-Tabelle für alle Felder jeder Tabelle einzuführen. Felder haben nämlich viel mehr Eigenschaften, als es MySQL bisher von selbst berücksichtigt. Das können sein
Aber achte darauf, dass Du die Teile der Eigenschaften, die MySQL bereits zur Verfügung stellt (Zugriffsrechte bis auf Feldebene) nicht neu erfindest, sondern kompatibel einbindest!
Harzliche Grüße aus http://www.annerschbarrich.de
Tom
- Eine ausgelagerte PHP-Funktion soll 90% aller DB Zugriffe steuern. Lediglich Spezialfälle (wie 'join', etc.) sollen nicht berücksichtigt werden.
90% oder alle?
Der Funktion möchte ich einfach nur den Tabellennamen, die Felder und den Vergleichsoperator ("Where") übergeben.
Zurückbekommen möchte ich dann, gefüllte Variablen (Name = Feldname)
soll dies eine db-schnittstelle werden? oder business-logik? db abstraktionen gibts etliche.
Macht so etwas Sinn? Habt jemand so was schon gemacht und kann mir zur Ideenfindung mal sein Script zeigen?
ist vielleich ein bischen vielle, aber evtl. ein gedankenansatz:
<?php // * class SQL.php * // Klasse für SQLObjekt echo('<!-- '.FILE.'['.LINE.'] -->'."\r\n"); // require_once ('./php/Klassen/Objekt.php'); // class SQL EXTENDS Objekt { // var $COLUMNS; var $TABLE; var $WHERE; var $GROUP_BY; var $ORDER_BY; // var $SQL; // function &SQL($DatenObjekt = NULL) { } // function nimmCOLUMNS($COLUMNS = NULL) { } // function nimmWHERE($WHERE = NULL) { // function nimmGROUP_BY($GROUP_BY = NULL) { $this->GROUP_BY = $GROUP_BY; } // function nimmORDER_BY($ORDER_BY = NULL) { $this->ORDER_BY = $ORDER_BY; } // function &SELECT($SpaltenListe = NULL) { // function &INSERT($SpaltenListe = NULL) { } // function &UPDATE($SpaltenListe = NULL) { // function &DELETE($WHERE = NULL) { } // } ?>
<?php // * class MySQL.php * // Klasse für MySQLObjekt echo('<!-- '.FILE.'['.LINE.'] -->'."\r\n"); // require_once ('./php/Klassen/SQL/SQL.php'); // class MySQL EXTENDS SQL { // var $ConnectionID; var $Database; var $affected_rows; var $errno; var $error; var $LIMIT; var $num_rows; var $result; // function &MySQL($Host = NULL, $User = NULL, $Password = NULL, $Database = NULL) { return $this->ConnectionID; } // function &connect($Host = NULL, $User = NULL, $Password = NULL, $neueVerbindung = NULL) { //return $this->ConnectionID = mysql_connect($Host, $User, $Password, $neueVerbindung); return $this->ConnectionID = mysql_pconnect($Host, $User, $Password, $neueVerbindung); } // function &select_db($Database = NULL) { } // function &close() { echo('<!-- '.CLASS.'->close('.')['.LINE.'] -->'."\r\n"); if ($this->ConnectionID) { $this->ConnectionID = mysql_close($this->ConnectionID); $this->ConnectionID = NULL; } return $this->ConnectionID; $this->errno = mysql_errno($this->ConnectionID); $this->error = mysql_error($this->ConnectionID); } // function &query($SQL = NULL, $ConnectionID = NULL) { return $this->result; } // function &fetch_object($result = NULL) { echo('<!-- '.CLASS.'->fetch_object('.$result.')['.LINE.'] -->'."\r\n"); if (isset($result)) { return mysql_fetch_object($result); } return mysql_fetch_object($this->result); } // function &nimmLIMIT($LIMIT = NULL) { echo('<!-- '.CLASS.'->nimmLIMIT('.$LIMIT.')['.LINE.'] -->'."\r\n"); $this->LIMIT = $LIMIT; } // function &SELECT($Tabelle = NULL, $LIMIT = NULL) { echo('<!-- '.CLASS.'->SELECT('.$Tabelle.', '.$LIMIT.')['.LINE.'] -->'."\r\n"); } return $Liste; } // function &INSERT($SpaltenListe = NULL) { return $result; } // function &UPDATE($SpaltenListe = NULL) { return $result; } // function &DELETE($WHERE = NULL) { return $result; } // } ?>
<?php // * class DB2.php * // Klasse für DB2Objekt echo('<!-- '.FILE.'['.LINE.'] -->'."\r\n"); // require_once ('./php/Klassen/SQL/SQL.php'); // class DB2 EXTENDS SQL { // var $ConnectionID; var $Database; var $error; var $errormsg; var $FETCH_FIRST_ROWS_ONLY; var $num_rows; var $result; // function &DB2($Database = NULL, $User = NULL, $Password = NULL) { parent::__construct(); return $this->open(&$Database, &$User, &$Password); } // function &open($Database = NULL, $User = NULL, $Password = NULL) { return $this->ConnectionID; } // function &connect($Database = NULL, $User = NULL, $Password = NULL) { echo('<!-- '.CLASS.'->connect('.$Database.', User, Password'.')['.LINE.'] -->'."\r\n"); if (isset($_ENV['OS'])) { if ($_ENV['OS'] == 'Windows_NT') { $Host = 'Windows'; } } if (isset($_ENV['OSTYPE'])) { if ($_ENV['OSTYPE'] == 'linux') { $Host = 'Linux'; } } switch ($Host) { case 'Windows' : return odbc_connect($Database, $User, $Password, SQL_CUR_USE_ODBC); // mit ODBC Manager (WINDOWS) case 'Lnx13' : case 'Linux' : return odbc_connect($Database, $User, $Password); // ohne ODBC Manager (LINUX) } } // function &close() { echo('<!-- '.CLASS.'->close('.')['.LINE.'] -->'."\r\n"); return odbc_close($this->ConnectionID); } // function &exec($ConnectionID = NULL, $SQL = NULL) { echo('<!-- '.CLASS.'->exec('.$ConnectionID.', '.$SQL.')['.LINE.'] -->'."\r\n"); $sql = parent::SELECT(); if ($this->FETCH_FIRST_ROWS_ONLY <> '') { $sql .= ' FETCH FIRST '.$this->FETCH_FIRST_ROWS_ONLY.' ROWS ONLY'; } } // function &nimmFETCH_FIRST_ROWS_ONLY($FETCH_FIRST_ROWS_ONLY = NULL) { echo('<!-- '.CLASS.'->nimmLIMIT('.$FETCH_FIRST_ROWS_ONLY.')['.LINE.'] -->'."\r\n"); $this->FETCH_FIRST_ROWS_ONLY = $FETCH_FIRST_ROWS_ONLY; } // function &SELECT($Tabelle = NULL, $FETCH_FIRST_ROWS_ONLY = NULL) { echo('<!-- '.CLASS.'->SELECT('.$Tabelle.', '.$FETCH_FIRST_ROWS_ONLY.')['.LINE.'] -->'."\r\n"); } // function &INSERT($SpaltenListe = NULL) { $sql = parent::INSERT(&$SpaltenListe); $result = odbc_exec($this->ConnectionID, $sql); $this->error = odbc_error($this->ConnectionID); $this->errormsg = odbc_errormsg($this->ConnectionID); return $result; } // function &UPDATE($SpaltenListe = NULL) { $result = odbc_exec($this->ConnectionID, $sql); $this->error = odbc_error($this->ConnectionID); $this->errormsg = odbc_errormsg($this->ConnectionID); return $result; } // function &DELETE($WHERE = NULL) { return $result; } // } ?>
ich mußte leider rigoros kürzen, da zu lang. mit MySQL = new MySQL() kannst du dann ein objekt für mysql dbs erstellen.
viel spaß beim wurschteln.