<?php
/**
* Die Datei kann includiert werden um die Klasse "Db" benutzen zu können
* @package DbKlasse
* @version DbClass v0.1
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
/**
* Inkludiert die ErrorFileHandler Klasse
* @version DbClass v0.1
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
require_once('./include/efh.class.php');
/**
* Inkludiert den ExceptionHandler
* @version DbClass v0.1
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
require_once('./include/exceptionhandler.class.php');
/**
* Die Klasse "Db" stellt Funktionen bereit, die eine Kommunikation mit einem MySQL Server ermöglichen
* @version DbClass v0.1
* @todo
* <ol>
* <li>Weitere Funktionen hinzufügen</li>
* <li>Ausführliches Testen der Funktionen</li>
* </ol>
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
* @package DbKlasse
*/
class Db extends ExceptionHandler
{
/**#@+
* @var string
* @access private
*/
/**
* Speichert den Host für die Datenbankverbindung
*/
private $dbhost;
/**
* Speichert den User für die Datenbankverbindung
*/
private $dbuser;
/**
* Speichert das Passwort für die Verbindung
*/
private $dbpass;
/**
* Speichert die Datenbank
*/
private $dbdata;
/**#@-*/
/**
* Speichert die Verbindung zu einem Datenbankserver
* @var mixed
* @access private
*/
private $dbconnection;
/**
* Gibt an ob eine Verbindung zu einem Datenbankserver besteht
* @var bool
* @access private
*/
private $connected=false;
/**
* Gibt an ob eine Datenbank ausgewählt wurde
* @var bool
* @access private
*/
private $selected=false;
/**
* Gibt an wieviele Datensätze bei der Ausführung des letzten Querys betroffen sind
* @var int
* @access private
*/
private $num_rows=0;
/**
* Der Konstruktor der Klasse
* <p>Speichert die übergebenen Daten ab, stellt eine Verbindung her und wählt eine Datenbank</p>
* @param string $dbhost Enthält den Host zu dem eine Verbindung aufgebaut wird
* @param string $dbuser Enthält den User für die Verbindung
* @param string $dbpass Enthält das Passwort für die Verbindung
* @param string $dbdata Enthält die Datenbank die ausgewählt werden soll
* @uses Db::connect()
* @uses Db::select_db()
*/
function __construct($dbhost, $dbuser, $dbpass, $dbdata)
{
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
$this->dbdata = $dbdata;
$this->connect();
$this->select_db();
}
/**
* Der Konstruktor der Klasse
* <p>Speichert die übergebenen Daten ab, stellt eine Verbindung her und wählt eine Datenbank</p>
* @param string $dbhost Enthält den Host zu dem eine Verbindung aufgebaut wird
* @param string $dbuser Enthält den User für die Verbindung
* @param string $dbpass Enthält das Passwort für die Verbindung
* @param string $dbdata Enthält die Datenbank die ausgewählt werden soll
* @uses Db::connect()
* @uses Db::select_db()
*/
function db($dbhost, $dbuser, $dbpass, $dbdata)
{
$this->dbhost = $dbhost;
$this->dbuser = $dbuser;
$this->dbpass = $dbpass;
$this->dbdata = $dbdata;
$this->connect();
$this->select_db();
}
/**
* Stellt die Verbindung zu einer Datenbank her
* <p>Speichert die Verbindung in Db::dbconnection</p>
* <p>Setzt Db::connected auf true wenn die Verbindung besteht</p>
*/
private function connect()
{
$this->dbconnection = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpass)
or $this->error(mysql_error(), mysql_errno());
$this->connected=true;
}
/**
* Wählt eine Datenbank auf dem Server aus
* <p>Setzt Db::selected auf tru wenn eine Datenbank ausgewählt wurde</p>
*/
private function select_db()
{
@mysql_select_db($this->dbdata,$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
$this->selected=true;
}
/**
* Sendet ein Query an die Datenbank
* @param string $query Enthält den zu sendenden Query
* @param bool $error Gibt an ob ein Error diesen Query schickt, standardmäßig auf false
* @access private
*/
private function query($query)
{
@mysql_query($query,$this->dbconnection)
or parent::throwException(mysql_error(), mysql_errno());
}
/**
* Sendet ein SELECT Query an die Datenbank
* <p>Es ist möglich SQL interne Befehle wie DATE_ADD etc. in den $where_values zu übergeben
* $where und $where_op werden dann automatisch mit Leerstrings befüllt, damit kein Fehler
* entsteht, wenn das Query zusammengebaut wird</p>
* @param string $table Die Tabelle an die das Query gesendet werden soll
* @param array $values Die Inhalte die ausgelesen werden sollen
* @param array $where (optional) Die Spalten für die WHERE Klausel
* @param array $where_op (optional) Die Operationen die zwischen Spalten und WHERE Inhalten stehen
* @param array $where_values (optional) Die Inhalte für die WHERE Klausel
* @return mixed
* @uses Db::StringEscape(string)
* @uses Db::ArrayEscape(array)
*/
function select($table,$values,$where="",$where_op="",$where_values="") {
$table = $this->StringEscape($table);
$values = $this->ArrayEscape($values);
$where = $this->ArrayEscape($where);
$where_op = $this->ArrayEscape($where_op);
$where_values = $this->ArrayEscape($where_values);
$query = "SELECT ";
for($i=0;$i<count($values);$i++)
{
if($i!=count($values)-1)
{
$query.=$values[$i].", ";
}
else
{
$query.=$values[$i]." ";
}
}
$query.="FROM ".$table;
if(!empty($where_values))
{
$query.=" WHERE ";
while(count($where)<count($where_values))
{
array_push($where,'');
}
while(count($where_op)<count($where))
{
array_push($where_op,'');
}
for($i=0;$i<count($where);$i++)
{
if($i!=count($where)-1)
{
$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."' AND ";
}
else
{
$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."'";
}
}
}
$query.=";";
//echo $query."<br />";
$sql = @mysql_query($query,$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
$this->num_rows = mysql_num_rows($sql)
or $this->error(mysql_error(), mysql_errno());
return $sql;
}
function select_or($table,$values,$where="",$where_op="",$where_values="") {
$table = $this->StringEscape($table);
$values = $this->ArrayEscape($values);
$where = $this->ArrayEscape($where);
$where_op = $this->ArrayEscape($where_op);
$where_values = $this->ArrayEscape($where_values);
$query = "SELECT ";
for($i=0;$i<count($values);$i++)
{
if($i!=count($values)-1)
{
$query.=$values[$i].", ";
}
else
{
$query.=$values[$i]." ";
}
}
$query.="FROM ".$table;
if(!empty($where_values))
{
$query.=" WHERE ";
while(count($where)<count($where_values))
{
array_push($where,'');
}
while(count($where_op)<count($where))
{
array_push($where_op,'');
}
for($i=0;$i<count($where);$i++)
{
if($i!=count($where)-1)
{
$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."' OR ";
}
else
{
$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."'";
}
}
}
$query.=";";
//echo $query."<br />";
$sql = @mysql_query($query,$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
$this->num_rows = mysql_num_rows($sql)
or $this->error(mysql_error(), mysql_errno());
return $sql;
}
/**
* Sendet ein INSERT Query an die Datenbank
* <p>Es ist wichtig, dass $columns und $values die gleiche Anzahl von Werten enthält, ansonsten wird false zurückgeliefert</p>
* @param string $table Die Tabelle an die das Query gesendet werden soll
* @param array $columns Die Spalten in die etwas eingetragen werden soll
* @param array $values Die Inhalte die ausgelesen werden sollen
* @return bool
* @uses Db::StringEscape(string)
* @uses Db::ArrayEscape(array)
*/
function insert($table,$columns,$values) {
if(count($columns)==count($values))
{
$table = $this->StringEscape($table);
$columns = $this->ArrayEscape($columns);
$values = $this->ArrayEscape($values);
$query="INSERT INTO ".$table." (";
for($i=0;$i<count($columns);$i++)
{
if($i!=count($columns)-1)
{
$query.=$columns[$i].",";
}
else
{
$query.=$columns[$i].") VALUES (";
}
}
for($i=0;$i<count($values);$i++)
{
if($i!=count($values)-1)
{
$query.="'".$values[$i]."',";
}
else
{
$query.="'".$values[$i]."')";
}
}
$query.=";";
//echo $query."<br />";
$sql = @mysql_query($query,$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
$this->num_rows = mysql_affected_rows($this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
return mysql_insert_id();
}
else
{
return -1;
}
}
function update($table,$columns,$values,$where="",$where_op="",$where_values="") {
if(count($columns)==count($values))
{
$table = $this->StringEscape($table);
$columns = $this->ArrayEscape($columns);
$values = $this->ArrayEscape($values);
$where = $this->ArrayEscape($where);
$where_op = $this->ArrayEscape($where_op);
$where_values = $this->ArrayEscape($where_values);
$query="UPDATE ".$table." SET ";
for($i=0;$i<count($columns);$i++)
{
if($i!=count($columns)-1)
{
$query.=$columns[$i]."='".$values[$i]."', ";
}
else
{
$query.=$columns[$i]."='".$values[$i]."'";
}
}
if(!empty($where_values))
{
$query.=" WHERE ";
while(count($where)<count($where_values))
{
array_push($where,'');
}
while(count($where_op)<count($where))
{
array_push($where_op,'');
}
for($i=0;$i<count($where);$i++)
{
if($i!=count($where)-1)
{
$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."' AND ";
}
else
{
$query.=$where[$i].$where_op[$i]."'".$where_values[$i]."'";
}
}
}
$query.=";";
echo $query."<br />";
$sql = @mysql_query($query,$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
$this->num_rows = mysql_affected_rows($this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
return true;
}
else
{
return false;
}
}
/**
* Gibt die Anzahl der betroffenen Datensätze des letzten Querys zurück
* @return int
*/
function get_num_rows() {
return $this->num_rows;
}
function error($err, $errno)
{
if($this->connected==false)
{
parent::throwException(mysql_error(), mysql_errno());
}
elseif($this->selected==false)
{
parent::throwException(mysql_error(), mysql_errno());
}
else
{
$escaped = $this->ArrayEscape(array($err,$errno));
$query = "INSERT INTO fehler(fehler_meldung,fehler_nummer,fehler_zeit)
VALUES('".$escaped[0]."','".$escaped[1]."','".date("Y-m-d H:i:s")."')";
$this->query($query);
}
}
function ArrayEscape($sEscape)
{
for($i=0;$i<count($sEscape)-1;$i++)
{
$sEscape[$i] = mysql_real_escape_string($sEscape[$i],$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
}
return $sEscape;
}
function StringEscape($sEscape)
{
return mysql_real_escape_string($sEscape,$this->dbconnection)
or $this->error(mysql_error(), mysql_errno());
}
}
?>