<?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');
/**
* 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
{
/**#@+
* @var string
* @access private
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
/**
* 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
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
private $dbconnection;
/**
* Gibt an ob eine Verbindung zu einem Datenbankserver besteht
* @var bool
* @access private
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
private $connected=false;
/**
* Gibt an ob eine Datenbank ausgewählt wurde
* @var string
* @access private
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
private $selected=false;
/**
* 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()
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
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>
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
private function connect()
{
$this->dbconnection = @mysql_connect($this->dbhost, $this->dbuser, $this->dbpass)
or die($this->error(mysql_error, mysql_errno, "Konnte keine Verbindung herstellen"));
$this->connected=true;
}
/**
* Wählt eine Datenbank auf dem Server aus
* <p>Setzt Db::selected auf tru wenn eine Datenbank ausgewählt wurde</p>
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
private function select_db()
{
@mysql_select_db($this->dbdata,$this->dbconnection)
or die($this->error(mysql_error($this->dbconnection),
mysql_errno($this->dbconnection)));
$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
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
private function query($query,$error=false)
{
if($error==false)
{
@mysql_query($query,$this->dbconnection)
or die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
}
else
{
@mysql_query($query,$this->dbconnection)
or die($query);
}
}
/**
* 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)
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
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 die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
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 die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
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)
* @author Tobias Lückel
* @copyright Copyright (c) 2008, Tobias Lückel
*/
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 die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
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($i0;$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.=";";
$sql = @mysql_query($query,$this->dbconnection)
or die($this->error(mysql_error($this->dbconnection),mysql_errno($this->dbconnection)));
return true;
}
else
{
return false;
}
}
function num_rows($table,$values,$where="",$where_op="",$where_values="") {
$sql = $this->select($table,$values,$where,$where_op,$where_values);
$count = mysql_num_rows($sql);
return $count;
}
function num_rows_or($table,$values,$where="",$where_op="",$where_values="") {
$sql = $this->select_or($table,$values,$where,$where_op,$where_values);
$count = mysql_num_rows($sql);
return $count;
}
function error($err, $errno, $comment="")
{
if($this->connected==false)
{
$this->errorausgabe($errno, $comment);
}
elseif($this->selected==false)
{
$this->errorausgabe($errno, $comment);
}
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,true);
$this->errorausgabe($errno, $comment);
}
}
private function errorausgabe($errno, $comment="")
{
global $smarty;
$smarty->assign('titel','FutureWars - Delta Version');
$smarty->assign('logotitel','FutureWars');
$efh = new ErrorFileHandler();
$code = $efh->getErrorCode($errno);
if($comment=="")
{
switch($errno)
{
case $errno<1000:
$fehlermeldung = "Die Error Nummer ist kleiner als 1000 nämlich: ".$errno."<br />
Bitte wenden Sie sich an den Administrator.<br />
Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
break;
case 1049:
$fehlermeldung = "Es besteht ein allgemeines Problem mit der Datenbank. <br />
Bitte wenden Sie sich an den Administrator.<br />
Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
break;
case $errno>1000:
$fehlermeldung = "Die Error Nummer ist grösser als 1000 nämlich: ".$errno."<br />
Bitte wenden Sie sich an den Administrator.<br />
Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
break;
}
}
else
{
$fehlermeldung = $comment."<br />
Bitte wenden sie sich an den Administrator.<br />
Teilen sie Fehlercode ".$code." und Zeit: ".date("Y-m-d H:i:s")." mit.";
}
$smarty->assign('fehlermeldung',$fehlermeldung);
$smarty->display('fehler.tpl');
}
function ArrayEscape($sEscape)
{
for($i=0;$i<count($sEscape)-1;$i++)
{
$sEscape[$i] = mysql_real_escape_string($sEscape[$i],$this->dbconnection);
}
return $sEscape;
}
function StringEscape($sEscape)
{
return mysql_real_escape_string($sEscape,$this->dbconnection);
}
}
?>