/*
Datenbank-Klasse
Version: 0.2
Changed: 21.09.05
*/
class Database
{
//Konstanten
var $CACHESIZE; # Anzahl der festzuhaltenden Query-Results
var $DEBUG = false; # Debug-Mode
var $SQLCACHE; # speichert letzen SQL-String
//Membervariablen
var $DB_HANDLE; # Handle zur Datenbankverbindung
var $DB_TYPE; # Datenbank-Typ
var $DB_HOST; # Hostname der Datanbank
var $DB_USER; # Datenbank Benutzer
var $DB_PASS; # Benutzer Passwort
var $DB_BASE; # Datenbank-Name
var $DB_PORT; # Port über den die Datenbank erreichbar ist
var $DB_LastError;
var $DB_ResultError;
var $DB_LastNotice;
/*
Beschreibung ConnectionString
String enthält Parameter mit Wert getrennt durch Leerzeichen
Der Datanbank-Typ wird durch den Parameter "Type" angegeben.
Reihenfolge, Groß/Kleinschreibung der Parameter ist nicht zwingend.
z.B. $constr = "Type=MySQL host=localhost user=oneuser pass=secret base=dbname port=1234"
*/
/***** K O N S T R U K T O R *****/
function Database ($ConnectionString)
{
preg_match_all ("/(.*)=(.*) /iU", $ConnectionString . " ", $match);
for ($i = 0; $i < count ($match[0]); $i++)
{
$var = "DB_" . strtoupper ($match[1][$i]);
$this->$var = trim ($match[2][$i]);
}
//Datenbank-Typ prüfen
$this->DB_TYPE = strtoupper ($this->DB_TYPE);
$this->ConnectToDatabase ();
}
/***** Baut Verbindung zur Datenbank auf *****/
function ConnectToDatabase ()
{
switch ($this->DB_TYPE)
{
case "MYSQL":
$this->DB_HANDLE = @mysql_pconnect ($this->DB_HOST, $this->DB_USER, $this->DB_PASS);
$mysql_select_db = @mysql_select_db ($this->DB_BASE, $this->DB_HANDLE);
break;
case "PGSQL":
$strCon = $this->GenConnectionStringPG ();
$this->DB_HANDLE = @pg_connect ($strCon);
break;
}
//evtl. Fehlermeldungen
if (!$this->DB_HANDLE)
die ("Wegen Wartungsarbeiten ist die Webseite vorübergehend nicht erreichbar.");
if ($this->DB_TYPE == "MYSQL" && !$mysql_select_db)
die ("Fehler beim Verbinden mit Datenbank");
}
function CloseDB ()
{
switch ($this->DB_TYPE)
{
case "MYSQL":
//@mysql_close ($this->DB_HANDLE);
breaK;
case "PGSQL":
@pg_close ($this->DB_HANDLE);
break;
}
}
/***** Sendet Abfrage-String und gibt Ergebnis zurück; speichert ggf. Fehler *****/
function Query ($strSQL)
{
$this->SQLCACHE = $strSQL;
if ($this->DEBUG) {
print "$strSQL
";
return true;
}
//$strSQL = addslashes ($strSQL);
switch ($this->DB_TYPE)
{
case "MYSQL":
$query = @mysql_query ($strSQL, $this->DB_HANDLE);
if (!$query)
$this->DB_LastError = @mysql_error ($this->DB_HANDLE);
$this->DB_ResultError = @mysql_error ($this->DB_HANDLE);
break;
case "PGSQL":
@pg_send_query ($this->DB_HANDLE, $strSQL);
$query = @pg_get_result ($this->DB_HANDLE);
$this->DB_ResultError = pg_result_error ($query);
$this->DB_LastError = pg_last_error ($this->DB_HANDLE);
$this->DB_LastNotice = pg_last_notice ($this->DB_HANDLE);
break;
case "OPGSQL":
@pg_send_query ($this->DB_HANDLE, $strSQL);
$query = @pg_get_result ($this->DB_HANDLE);
$this->DB_ResultError = pg_result_error ($query);
$this->DB_LastError = pg_last_error ($this->DB_HANDLE);
$this->DB_LastNotice = pg_last_notice ($this->DB_HANDLE);
break;
}
return $query;
}
function VarCheck (&$Source, &$Check)
{
$data_keys = array_keys ($Source);
$check_keys = array_keys ($Check);
$delete = array_diff ($data_keys , $check_keys);
$add = array_diff ($check_keys, $data_keys );
// unnötige Felder entfernen
foreach ($delete as $a) {
unset ($Source[$a]);
}
// fehlende Felder ergänzen
foreach ($add as $a) {
$Source[$a] = $Check[$a];
}
// Trimmen
foreach ($Source as $key => $value) {
$Source[$key] = trim ($value);
}
}
/***** Führt INSERT anhand eines Arrays aus *****/
function Insert_Array ($table, $assocArray, $VarCheck = false)
{
/*
print "ARRAY:";
print_r($assocArray);
exit;
*/
// Array-Elemente prüfen
if (is_array ($VarCheck)) {
$this->VarCheck ($assocArray, $VarCheck);
}
$sql = "INSERT INTO $table ";
$fields = "(";
$values = "(";
foreach ($assocArray as $key => $value)
{
$fields .= $key . ", ";
$values .= "'" . addslashes ($value) . "', ";
}
$this->CutChars ($fields, 2);
$this->CutChars ($values, 2);
$sql .= $fields . ") VALUES " . $values . ")";
/*
print "INSERT: $sql
";
exit;
*/
$query = $this->Query ($sql);
return $query;
}
/***** Führt UPDATE anhand eines Arrays aus *****/
function Update_Array ($table, $assocArray, $where, $VarCheck = false)
{
// Array-Elemente prüfen
if (is_array ($VarCheck)) {
$this->VarCheck ($assocArray, $VarCheck);
}
$sql = "UPDATE $table SET ";
foreach ($assocArray as $key => $value)
$sql .= $key . " = '" . addslashes ($value) . "', ";
$this->CutChars ($sql, 2);
$sql .= " WHERE $where";
/*
print "UPDATE: $sql
";
exit;
*/
$query = $this->Query ($sql);
return $query;
}
/***** Führt DELETE aus, mehrer Datensätze per Array *****/
function Delete_Row ($table, $where)
{
if (!is_array ($where))
$where = array ($where);
foreach ($where as $delrow)
{
$sql = "DELETE FROM $table WHERE $delrow";
$this->Query ($sql);
}
}
/***** Gibt das komplette Ergebnis als ass. Array zurück *****/
function Fetch_All ($strQuery)
{
$query = $this->Query ($strQuery);
$resAll = array ();
switch ($this->DB_TYPE)
{
case "MYSQL":
while ($data = @mysql_fetch_assoc ($query))
$resAll[] = $data;
break;
case "PGSQL":
while ($data = @pg_fetch_assoc ($query))
$resAll[] = $data;
break;
case "OPGSQL":
$rows = @pg_numrows ($query);
for ($i = 0; $i < $rows; $i++)
$resAll[] = @pg_fetch_array ($query, $i, PGSQL_ASSOC);
break;
}
return $resAll;
}
function Fetch_Column ($strQuery, $ColumnKey)
{
$query = $this->Query ($strQuery);
$result = array ();
switch ($this->DB_TYPE)
{
case "MYSQL":
break;
case "PGSQL":
$rows = pg_numrows ($query);
for ($i = 0; $i < $rows; $i++) {
$result[] = pg_result ($query, $i, $ColumnKey);
}
break;
case "OPGSQL":
break;
}
return $result;
}
function Fetch_KeyList ($strQuery, $ColumnKey)
{
$query = $this->Query ($strQuery);
$result = array ();
switch ($this->DB_TYPE)
{
case "MYSQL":
break;
case "PGSQL":
while ($data = @pg_fetch_assoc ($query)) {
$result[$data[$ColumnKey]] = $data;
}
break;
case "OPGSQL":
break;
}
return $result;
}
/***** Gibt einen Datensatz als indiziertes Array zurück *****/
function Fetch_Row ($strQuery, $row = 0)
{
$query = $this->Query ($strQuery);
if (!$query) return false;
switch ($this->DB_TYPE)
{
case "MYSQL":
$row = @mysql_fetch_row ($query);
break;
case "PGSQL":
$row = @pg_fetch_row ($query, $row);
break;
case "OPGSQL":
$row = @pg_fetch_array ($query, $row, PGSQL_NUM);
break;
}
return $row;
}
/***** Gibt einen Datensatz als ass. Array zurück *****/
function Fetch_Assoc ($strQuery, $row = 0)
{
$query = $this->Query ($strQuery);
switch ($this->DB_TYPE)
{
case "MYSQL":
$row = @mysql_fetch_assoc ($query);
break;
case "PGSQL":
$row = @pg_fetch_assoc ($query, $row);
break;
case "OPGSQL":
$row = @pg_fetch_array ($query, $row, PGSQL_ASSOC);
break;
}
return $row;
}
/***** Gibt Anzahl Datensätze (TableRows) zurück *****/
function GetRows ($strSQL)
{
$query = $this->Query ($strSQL);
switch ($this->DB_TYPE)
{
case "MYSQL":
$rows = @mysql_num_rows ($query);
break;
case "PGSQL":
$rows = @pg_num_rows ($query);
break;
case "OPGSQL":
$rows = @pg_numrows ($query);
break;
}
return $rows;
}
function Result ($sql, $field)
{
$query = $this->Query ($sql);
if (!$query) return false;
switch ($this->DB_TYPE)
{
case "MYSQL":
$result = @mysql_result ($query, 0, $field);
break;
case "PGSQL":
$result = @pg_fetch_result ($query, 0, $field);
break;
case "OPGSQL":
$result = @pg_result ($query, 0, $field);
break;
}
return $result;
}
/***** gibt true zurück, wenn Ergebnis mindestens eine Zeile *****/
function isResult ($sql)
{
$query = $this->Query ($sql);
if (!$query) return false;
switch ($this->DB_TYPE)
{
case "MYSQL":
$rows = @mysql_num_rows ($query);
break;
case "PGSQL":
$rows = @pg_num_rows ($query);
break;
case "OPGSQL":
$rows = @pg_numrows ($query);
break;
}
if ($rows > 0)
return true;
else
return false;
}
/***** Oeffnet eine SQL-Datei und fuehrt sie aus *****/
function ExecuteFile ($FileName)
{
//Datei oeffnen
$fp = fopen ($FileName, "r");
if (!$fp) return false;
$strSQL = fread ($fp, filesize ($FileName));
//Kommentare entfernen
$strSQL = preg_replace ("/--.*?\n/" , "", $strSQL);
$strSQL = preg_replace ("/\/\*.*?\*\//s", "", $strSQL);
preg_match_all ("/.*?;/s", $strSQL, $match );
foreach ( $match[0] as $sql )
{
$query = mysql_query ($sql, $this->DB_HANDLE);
if ( !$query )
return false;
}
return true;
}
/***** Gibt die ID des letzten Inserts zurück (nur MySQL) *****/
function GetLastInsertID ()
{
return @mysql_insert_id ($this->DB_HANDLE);
}
############# HILFSFUNKTIONEN #############
function GenConnectionStringPG ()
{
$strCon = "";
if ($this->DB_HOST != "") $strCon .= " host=" . $this->DB_HOST;
if ($this->DB_USER != "") $strCon .= " user=" . $this->DB_USER;
if ($this->DB_BASE != "") $strCon .= " dbname=" . $this->DB_BASE;
if ($this->DB_PORT != "") $strCon .= " port=" . $this->DB_PORT;
if ($this->DB_PASS != "") $strCon .= " password=" . $this->DB_PASS;
return $strCon;
}
function CutChars (&$str, $count)
{
$str = substr ($str, 0, strlen ($str) - $count);
}
/*** END OF CLASS ***/
/*
switch ($this->DB_HANDLE)
{
case "MYSQL":
break;
case "PGSQL":
break;
case "OPGSQL":
break;
}
*/
}