MySQL Klasse
Aus php bar
Die nachfolgenden Klassen, die im wesentlichen in TMySql und TMySqlResultSet enden, stellen einige Methoden zur Verfügung, mit der in einem Web-Projekt schnell und unkompliziert Datenbankabfragen ausgeführt werden können.
Die verschachtelte Struktur von Klassen und Interfaces dient dem modularen Aufbau; die Entstehung dieser Klassen basiert jedoch auf der Verwendung von MySQL, so dass für andere Datenbank-Server Anpassungen notwendig sein dürften.
Die Entwicklung der nachstehenden Klassen ist nicht abgeschlossen; Ergänzungen werden hier unregelmäßig erfolgen.
Die Klassen benötigen mindestens PHP 5.
Inhaltsverzeichnis |
Klassen
1 /** 2 * @file 3 * @brief Datenbanklayer 4 * @author Hinrich Donner 5 * 6 * Dieser Quellcode ist urheberrechtlich geschützt. Er kann unter den Lizenzbedingungen der 7 * GPL oder LGPL verwendet werden. 8 */ 9 10 /** 11 * @brief Basis-Exception für Datenbank-Anfragen 12 */ 13 class EDatabase extends Exception 14 { 15 }
class EMySql extends EDatabase
1 /** 2 * @brief Basis-Exception für MySQL-Abfragen 3 */ 4 class EMySql extends EDatabase 5 { 6 /** 7 * @brief Konstruktor 8 */ 9 function __construct() 10 { 11 $message = sprintf('%04d: %s', mysql_errno(), mysql_error()); 12 parent::__construct($message, mysql_errno()); 13 } 14 }
abstract class TDatabaseResultSet implements Iterator
1 /** 2 * @brief Ergebnismenge einer Datenbank-Abfrage 3 */ 4 abstract class TDatabaseResultSet implements Iterator 5 { 6 /** 7 * @brief Anzahl der Zeilen in der Ergebnismenge 8 * @var int 9 */ 10 protected $_num_rows = 0; 11 12 /** 13 * @brief Die Ergebnismenge 14 * @var array 15 */ 16 protected $_rows = array(); 17 18 /** 19 * @brief Konstruktor 20 * @param resource $resource Datenbank-Resource 21 */ 22 abstract function __construct($resource) 23 24 /** 25 * @brief Das aktuelle Element (Iterator) 26 * @return array 27 */ 28 public function current() 29 { 30 return current($this->_rows); 31 } 32 33 /** 34 * @brief Das nächste Element (Iterator) 35 * @return array 36 */ 37 public function next() 38 { 39 return next($this->_rows); 40 } 41 42 /** 43 * @brief Der Index des aktuellen Elements (Iterator) 44 * @return array 45 */ 46 public function key() 47 { 48 return key($this->_rows); 49 } 50 51 /** 52 * @brief Das erste Element (Rücksetzen des Zeigers, Iterator) 53 * @return array 54 */ 55 public function rewind() 56 { 57 return reset($this->_rows); 58 } 59 60 /** 61 * @brief Prüfen des aktuellen Elements (Iterator) 62 * @return bool 63 */ 64 public function valid() 65 { 66 return (bool) is_array($this->current()); 67 } 68 }
class TMySqlResult extends TDatabaseResultSet implements Iterator
1 /** 2 * @brief Ergebnismenge einer MySQL-Abfrage 3 */ 4 class TMySqlResult extends TDatabaseResultSet 5 { 6 /** 7 * @brief Konstruktor 8 * @param resource $resource MySQL-Ergebnis-Resource 9 */ 10 function __construct($resource) 11 { 12 while ($row = mysql_fetch_assoc($resource)) 13 { 14 $this->_rows[] = $row; 15 ++ $this->_num_rows; 16 } 17 } 18 19 }
interface IDatabase
1 /** 2 * @brief Abstrakte Interface-Definition 3 */ 4 interface IDatabase 5 { 6 /** 7 * @brief Datenbankverbindung aufbauen 8 * @param string $host IP oder Domain des Servers 9 * @param string $user Berechtigter Benutzer 10 * @param string $passwd Kennwort des Benutzers 11 */ 12 public function connect($host, $user, $passwd); 13 14 /** 15 * @brief Datenbankverbindung lösen 16 */ 17 public function close(); 18 19 /** 20 * @brief Datenbank auswählen 21 * @param string $name Name der Datenbank 22 */ 23 public function select($name); 24 25 /** 26 * @brief Datenbankanweisung ausführen 27 * @param string $sql Die Anweisung an die Datenbank 28 * @return mixed 29 */ 30 public function execute($sql); 31 32 /** 33 * @brief Datenbankabfrage 34 * @param string $sql Die Anweisung 35 * @param int $offset Relativer Beginn der Ergebnismenge 36 * @param int $limit Maximale Anzahl der Zeilen in der Ergebnismenge 37 * @return TDatabaseResultSet 38 */ 39 public function query($sql, $offset = 0, $limit = -1); 40 }
abstract class TDatabase implements IDatabase
1 /** 2 * @brief Abstrakte Basis des Datenbank-Layers 3 */ 4 abstract class TDatabase implements IDatabase 5 { 6 /** 7 * @brief Name der aktuellen Datenbank 8 * @var string 9 */ 10 protected $database = ''; 11 12 /** 13 * @brief Datenbankhandle 14 * @var resource 15 */ 16 protected $resource = false; 17 18 /** 19 * @brief Container mit den ausgeführten Anweisungen 20 * @var array 21 */ 22 protected $statements = array(); 23 24 /** 25 * @brief Erste Zeile einer Abfrage ermitteln 26 * @param string $sql Anweisung 27 * @param int $offset Relativer Offset 28 * @return TDatabaseResultSet 29 */ 30 public function queryRow($sql, $offset = 0) 31 { 32 $dbr = $this->query($sql, $offset, 1); 33 $result = $dbr->current(); 34 return $result; 35 } 36 37 /** 38 * @brief Erste Zelle der ersten Zeile einer Abfrage 39 * @param string $sql Die Abfrage 40 * @return mixed Der Wert des Feldes 41 */ 42 public function queryOne($sql) 43 { 44 $row = $this->queryRow($sql); 45 return reset($row); 46 } 47 }
class TMySql extends TDatabase
1 /** 2 * @brief MySQL-Layer 3 */ 4 class TMySql extends TDatabase 5 { 6 /** 7 * @brief Konstruktor 8 * @param string $host IP oder Domain des Servers 9 * @param string $name Der Name der Daenbank 10 * @param string $user Berechtigter Benutzer 11 * @param string $passwd Kennwort des Benutzers 12 */ 13 function __construct($host, $name, $user, $passwd) 14 { 15 $this->connect($host, $user, $passwd); 16 $this->select($name); 17 } 18 19 /** 20 * @breif Destruktor 21 */ 22 function __destruct() 23 { 24 $this->close(); 25 } 26 27 /** 28 * @brief Datenbankverbindung aufbauen 29 * @param string $host IP oder Domain des Servers 30 * @param string $user Berechtigter Benutzer 31 * @param string $passwd Kennwort des Benutzers 32 */ 33 public function connect($host, $user, $passwd) 34 { 35 $this->close(); 36 $__er = error_reporting(E_ERROR); 37 if (!$this->resource = mysql_connect($host, $user, rawurlencode($passwd))) 38 { 39 error_reporting($__er); 40 throw new EMySql(); 41 } 42 error_reporting($__er); 43 } 44 45 /** 46 * @brief Datenbankverbindung lösen 47 */ 48 public function close() 49 { 50 if (!$resource) 51 return; 52 mysql_close($this->resource); 53 $this->resource = false; 54 } 55 56 /** 57 * @brief Datenbank auswählen 58 * @param string $name Name der Datenbank 59 */ 60 public function select($name) 61 { 62 if (!mysql_select_db($name, $this->resource)) 63 throw new EMySql(); 64 $this->database = $name; 65 } 66 67 /** 68 * @brief Datenbankanweisung ausführen 69 * @param string $sql Die Anweisung an die Datenbank 70 * @return mixed 71 */ 72 public function execute($sql) 73 { 74 $this->statements[] = $sql; 75 if (!($result = mysql_unbuffered_query($sql, $this->resource))) 76 throw new EMySql(); 77 return $result; 78 } 79 80 /** 81 * @brief Datenbankabfrage 82 * @param string $sql Die Anweisung 83 * @param int $offset Relativer Beginn der Ergebnismenge 84 * @param int $limit Maximale Anzahl der Zeilen in der Ergebnismenge 85 * @return TDatabaseResultSet 86 */ 87 public function query($sql, $offset = 0, $limit = -1) 88 { 89 if ($limit != -1) 90 $sql .= sprintf(' LIMIT %d, %d', $offset, $limit); 91 return new TMySqlResult($this->execute($sql)); 92 } 93 }
Beispiel einer Verwendung:
1 $db = new TMySql('localhost', 'mydb', 'root', 'geheim'); 2 $sql = "SELECT `name`, `telefon` FROM `telefonliste` ORDER BY `name` ASC"; 3 $dbr = $db->query($sql); 4 foreach ($dbr as $row) 5 echo "$row[name]: $row[telefon]<br>\n";

