10.09.2008, 17:30
|
#1 (permalink)
|
|
Erfahrener Benutzer
Registriert seit: 04.08.2008
Beiträge: 132
|
[PHP} Datenbank Klasse
PHP-Code:
<?php /** * @file * @brief Datenbanklayer * @author Hinrich Donner * * Dieser Quellcode ist urheberrechtlich geschützt. Er kann unter den Lizenzbedingungen der * GPL oder LGPL verwendet werden. * @package Datenbank */ /** * @brief Basis-Exception für Datenbank-Anfragen */ class EDatabase extends Exception { } /** * @brief Basis-Exception für MySQL-Abfragen */ class EMySql extends EDatabase { /** * @brief Konstruktor */ function __construct() { $message = sprintf('%04d: %s', mysql_errno(), mysql_error()); parent::__construct($message, mysql_errno()); } } /** * @brief Ergebnismenge einer Datenbank-Abfrage */ abstract class TDatabaseResultSet implements Iterator { /** * @brief Anzahl der Zeilen in der Ergebnismenge * @var int */ protected $_num_rows = 0; /** * @brief Die Ergebnismenge * @var array */ protected $_rows = array(); /** * @brief Konstruktor * @param resource $resource Datenbank-Resource */ /** * @brief Das aktuelle Element (Iterator) * @return array */ public function current() { return current($this->_rows); } /** * @brief Das nächste Element (Iterator) * @return array */ public function next() { return next($this->_rows); } /** * @brief Der Index des aktuellen Elements (Iterator) * @return array */ public function key() { return key($this->_rows); } /** * @brief Das erste Element (Rücksetzen des Zeigers, Iterator) * @return array */ public function rewind() { return reset($this->_rows); } /** * @brief Prüfen des aktuellen Elements (Iterator) * @return bool */ public function valid() { return (bool) is_array($this->current()); } public function get_num_rows() { return $this->_num_rows; } } /** * @brief Ergebnismenge einer MySQL-Abfrage */ class TMySqlResult extends TDatabaseResultSet { /** * @brief Konstruktor * @param resource $resource MySQL-Ergebnis-Resource */ function __construct($resource) { $this->_num_rows = 0; while ($row = @mysql_fetch_assoc($resource)) { $this->_rows[] = $row; ++ $this->_num_rows; } } } /** * @brief Abstrakte Interface-Definition */ interface IDatabase { /** * @brief Datenbankverbindung aufbauen * @param string $host IP oder Domain des Servers * @param string $user Berechtigter Benutzer * @param string $passwd Kennwort des Benutzers */ public function connect($host, $user, $passwd); /** * @brief Datenbankverbindung lösen */ public function close(); /** * @brief Datenbank auswählen * @param string $name Name der Datenbank */ public function select($name); /** * @brief Datenbankanweisung ausführen * @param string $sql Die Anweisung an die Datenbank * @return mixed */ public function execute($sql); /** * @brief Datenbankabfrage * @param string $sql Die Anweisung * @param int $offset Relativer Beginn der Ergebnismenge * @param int $limit Maximale Anzahl der Zeilen in der Ergebnismenge * @return TDatabaseResultSet */ public function query($sql, $offset = 0, $limit = -1); } /** * @brief Abstrakte Basis des Datenbank-Layers */ abstract class TDatabase implements IDatabase { /** * @brief Name der aktuellen Datenbank * @var string */ protected $database = ''; /** * @brief Datenbankhandle * @var resource */ protected $resource = false; /** * @brief Container mit den ausgeführten Anweisungen * @var array */ protected $statements = array(); /** * @brief Anzahl der ausgeführten Querys * @var int */ protected $count_querys = 0; /** * Speichert die Startzeit in Millisekunden * @var float */ protected $start = 0; /** * Speichert die Endzeit in Millisekunden * @var float */ protected $end = 0; /** * @brief Erste Zeile einer Abfrage ermitteln * @param string $sql Anweisung * @param int $offset Relativer Offset * @return TDatabaseResultSet */ public function queryRow($sql, $offset = 0) { $dbr = $this->query($sql, $offset, 1); $result = $dbr->current(); return $result; } /** * @brief Erste Zelle der ersten Zeile einer Abfrage * @param string $sql Die Abfrage * @return mixed Der Wert des Feldes */ public function queryOne($sql) { $row = $this->queryRow($sql); return reset($row); } } /** * @brief MySQL-Layer */ class TMySql extends TDatabase { /** * @brief Konstruktor * @param string $host IP oder Domain des Servers * @param string $name Der Name der Daenbank * @param string $user Berechtigter Benutzer * @param string $passwd Kennwort des Benutzers */ function __construct($host, $name, $user, $passwd) { $this->connect($host, $user, $passwd); $this->select($name); } /** * @brief Destruktor */ function __destruct() { $this->close(); } /** * @brief Datenbankverbindung aufbauen * @param string $host IP oder Domain des Servers * @param string $user Berechtigter Benutzer * @param string $passwd Kennwort des Benutzers */ public function connect($host, $user, $passwd) { $this->close(); $__er = error_reporting(E_ERROR); if (!$this->resource = mysql_connect($host, $user, rawurlencode($passwd))) { error_reporting($__er); throw new EMySql(); } error_reporting($__er); } /** * @brief Datenbankverbindung lösen */ public function close() { if (!$this->resource) return; mysql_close($this->resource); $this->resource = false; } /** * @brief Datenbank auswählen * @param string $name Name der Datenbank */ public function select($name) { if (!mysql_select_db($name, $this->resource)) throw new EMySql(); $this->database = $name; } /** * @brief Datenbankanweisung ausführen * @param string $sql Die Anweisung an die Datenbank * @return mixed */ public function execute($sql) { $this->statements[] = $sql; if (!($result = mysql_unbuffered_query($sql, $this->resource))) throw new EMySql(); $this->count_querys++; return $result; } /** * @brief Datenbankabfrage * @param string $sql Die Anweisung * @param int $offset Relativer Beginn der Ergebnismenge * @param int $limit Maximale Anzahl der Zeilen in der Ergebnismenge * @return TDatabaseResultSet */ public function query($sql, $offset = 0, $limit = -1) { //echo $sql."<br />"; if ($limit != -1) $sql .= sprintf(' LIMIT %d, %d', $offset, $limit); $sql = $this->execute($sql); return new TMySqlResult($sql); } /** * Führt den Query aus und liefert danach die letzte insert ID * @param string $sql Die Anweisung * @return int * @author Tobias Lückel */ public function insert($sql) { $this->execute($sql); return mysql_insert_id(); } /** * Führt den Query aus und liefert danach die Anzahl der betroffenen Datensätze * @param string $sql Die Anweisung * @return int * @author Tobias Lückel */ public function update($sql) { $this->execute($sql); return mysql_affected_rows(); } /** * Gibt die aktuelle Datenbankverbindung zurück * @return MySQL Resource * @author Tobias Lückel */ public function getResource() { return $this->resource; } /** * Liefert die Anzahl der ausgeführten Querys zurück * @return int * @author Tobias Lückel */ public function getAnzahlQuerys() { return $this->count_querys; } /** * Liefert alle ausgeführten Statements zurück * @return string * @author Tobias Lückel */ public function getStatements() { return $this->statements; } /** * Liefert einen escapten String zurück * @return string * @author Tobias Lückel */ public function escapeString($input) { return mysql_real_escape_string($input,$this->getResource()); } } ?>
was haltet ihr von der Datenbankklasse? Habe ich nicht selber geschrieben, nur ein paar Sachen ergänzt. Was verwendet ihr so? Benutzt ihr überhaupt Klassen?
|
|
|
|
|