Erste lauffähige Umgebung
This commit is contained in:
@@ -36,6 +36,19 @@ class Database
|
||||
*/
|
||||
static $filter = '1=1';
|
||||
|
||||
/**
|
||||
* Die Beziehung einer Datenbank-Tabelle zu einer anderen
|
||||
* $relations = array(
|
||||
* 0 => array(
|
||||
* 'ownKey' => 'Spaltenname der eigenen Tabelle',
|
||||
* 'foreignTable' => 'Tabellenname der "Fremd"-Tabelle',
|
||||
* 'foreignKey' => 'Spaltenname der "Fremd"-Tabelle
|
||||
* ),
|
||||
* );
|
||||
* @var array
|
||||
*/
|
||||
static $relations = array();
|
||||
|
||||
/**
|
||||
* Hier werden die Daten von getIndex() gespeichert
|
||||
* @var array
|
||||
@@ -48,18 +61,68 @@ class Database
|
||||
protected static $db = null;
|
||||
|
||||
|
||||
/**
|
||||
* Konstruktor schützen, weil Singleton
|
||||
* @author Christian Steinle
|
||||
*/
|
||||
protected function __construct()
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
protected function __clone()
|
||||
/**
|
||||
* Liefert ein mehrdimensionales, assoziatives Array mit allen Datensätzen, die zum Filter passen
|
||||
* als Schlüssel der ersten Dimension dient der Wert des Primär-Schlüssels der Datenbank-Tabelle
|
||||
* Legt alle Daten in self::$data ab
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @see self::query()
|
||||
* @see self::$data
|
||||
*
|
||||
* TODO: getIndex für static::$relations analog zu getItem
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
final public static function getIndex()
|
||||
{
|
||||
static::setRelations();
|
||||
$sql = 'SELECT * FROM ' . static::TBL_NAME . ' WHERE ' . static::$filter . ' ' . static::ORDER_BY . ';';
|
||||
self::$data = self::query($sql);
|
||||
return self::$data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Setzt die Variable zur Verbindung verschiedener Datenbank-Tabellen
|
||||
*/
|
||||
public static function setRelations()
|
||||
{
|
||||
static::$relations = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Liefert ein mehrdimensionales, assoziatives Array mit allen Datensätzen, die zum SQL-Query passen
|
||||
* als Schlüssel der ersten Dimension dient der Wert des Primär-Schlüssels der Datenbank-Tabelle
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param string $sql
|
||||
* @return array
|
||||
*/
|
||||
final protected static function query($sql)
|
||||
{
|
||||
self::getInstance();
|
||||
$result = self::$db->query($sql);
|
||||
$data = array();
|
||||
|
||||
while ($tmpData = $result->fetch_assoc())
|
||||
{
|
||||
$data[$tmpData[static::PRIMARY_KEY]] = $tmpData;
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Stellt die Datenbank-Verbindung her
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* return void
|
||||
*/
|
||||
@@ -72,56 +135,254 @@ class Database
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Macht das Update für den Eintrag in einer Datenbank-Tabelle
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param array $request
|
||||
* @return int
|
||||
*/
|
||||
final public static function update(array $request)
|
||||
{
|
||||
static::beforeUpdate($request);
|
||||
static::setRelations();
|
||||
|
||||
/**
|
||||
* @var Database $class
|
||||
*/
|
||||
foreach (static::$relations as $relation)
|
||||
{
|
||||
$class = $relation['foreignModel'];
|
||||
$request[$relation['ownKey']] = $class::update($request);
|
||||
}
|
||||
|
||||
|
||||
$primaryKey = intval($request[static::PRIMARY_KEY]);
|
||||
unset($request[static::PRIMARY_KEY]);
|
||||
|
||||
$model = self::queryModel(static::TBL_NAME, true);
|
||||
$updateData = array();
|
||||
|
||||
foreach ($request as $fieldName => $fieldValue)
|
||||
{
|
||||
if (in_array($fieldName, $model))
|
||||
{
|
||||
$updateData[] = $fieldName . ' = "' . self::$db->real_escape_string($fieldValue) . '"';
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($updateData))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
$sql = 'UPDATE ' . static::TBL_NAME . ' SET ' . implode(', ', $updateData) . ' WHERE ' . static::PRIMARY_KEY . ' = ' . $primaryKey . ' LIMIT 1;';
|
||||
$result = self::$db->query($sql);
|
||||
if ($result !== true)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return $primaryKey;
|
||||
}
|
||||
|
||||
/**
|
||||
* Liefert die Spalten einer Datenbank-Tabelle
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param string $tableName
|
||||
* @param bool $fieldsOnly
|
||||
* @return array
|
||||
*/
|
||||
final protected static function queryModel($tableName, $fieldsOnly = false)
|
||||
{
|
||||
self::getInstance();
|
||||
$sql = 'SHOW COLUMNS FROM ' . $tableName . ';';
|
||||
$result = self::$db->query($sql);
|
||||
$data = array();
|
||||
|
||||
while ($tmpData = $result->fetch_assoc())
|
||||
{
|
||||
if ($fieldsOnly === true)
|
||||
{
|
||||
$data[] = $tmpData['Field'];
|
||||
}
|
||||
else
|
||||
{
|
||||
$data[] = $tmpData;
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
}
|
||||
|
||||
/**
|
||||
* Schreibt einen neuen Eintrag in einer Datenbank-Tabelle
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param array $request
|
||||
* @return int
|
||||
*/
|
||||
final public static function insert(array $request)
|
||||
{
|
||||
static::beforeInsert($request);
|
||||
static::setRelations();
|
||||
|
||||
/**
|
||||
* @var Database $class
|
||||
*/
|
||||
foreach (static::$relations as $relation)
|
||||
{
|
||||
$class = $relation['foreignModel'];
|
||||
$request[$relation['ownKey']] = $class::insert($request);
|
||||
}
|
||||
|
||||
$model = self::queryModel(static::TBL_NAME, true);
|
||||
$updateData = array();
|
||||
|
||||
foreach ($request as $fieldName => $fieldValue)
|
||||
{
|
||||
if (in_array($fieldName, $model))
|
||||
{
|
||||
$updateData[$fieldName] = '"' . self::$db->real_escape_string($fieldValue) . '"';
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($updateData))
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
$keys = implode(', ', array_keys($updateData));
|
||||
$values = implode(', ', $updateData);
|
||||
$sql = 'INSERT INTO ' . static::TBL_NAME . ' (' . $keys . ') VALUES (' . $values . ');';
|
||||
$result = self::$db->query($sql);
|
||||
|
||||
if ($result !== true)
|
||||
{
|
||||
return -1;
|
||||
}
|
||||
|
||||
return self::$db->insert_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Entfernt einen Eintrag aus einer Datenbank-Tabelle
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param int $id
|
||||
* @return int
|
||||
*/
|
||||
final public static function delete($id)
|
||||
{
|
||||
static::beforeDelete($id);
|
||||
static::setRelations();
|
||||
|
||||
if (!empty(static::$relations))
|
||||
{
|
||||
$data = static::getItem($id);
|
||||
|
||||
/**
|
||||
* @var Database $class
|
||||
*/
|
||||
foreach (static::$relations as $relation)
|
||||
{
|
||||
$class = $relation['foreignModel'];
|
||||
$relationID = intval($data[$relation['foreignKey']]);
|
||||
$class::delete($relationID);
|
||||
}
|
||||
}
|
||||
|
||||
$query = 'DELETE FROM ' . static::TBL_NAME . ' WHERE ' . static::PRIMARY_KEY . ' = ' . $id . ' LIMIT 1;';
|
||||
$result = self::$db->query($query);
|
||||
|
||||
return (($result) ? 1 : 0);
|
||||
}
|
||||
|
||||
/**
|
||||
* Liefert ein assoziatives Array des Datensatzes mit der übergebenen ID
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param int $id
|
||||
* @return array
|
||||
*/
|
||||
final public static function getItem($id)
|
||||
{
|
||||
$sql = 'SELECT * FROM ' . static::TBL_NAME . ' WHERE ' . static::PRIMARY_KEY . ' = ' . $id . ';';
|
||||
static::setRelations();
|
||||
|
||||
if (empty(static::$relations))
|
||||
{
|
||||
$sql = 'SELECT * FROM ' . static::TBL_NAME . ' WHERE ' . static::PRIMARY_KEY . ' = ' . $id . ';';
|
||||
}
|
||||
else
|
||||
{
|
||||
$tables = array(static::TBL_NAME);
|
||||
$matches = array();
|
||||
foreach (static::$relations as $relation)
|
||||
{
|
||||
$class = $relation['foreignModel'];
|
||||
$tables[] = $class::TBL_NAME;
|
||||
$matches[] = static::TBL_NAME . '.' . $relation['ownKey'] . ' = ' . $class::TBL_NAME . '.' . $relation['foreignKey'];
|
||||
}
|
||||
|
||||
$sql = 'SELECT * FROM ' . implode(', ', $tables) . ' WHERE ' . static::PRIMARY_KEY . ' = ' . $id . ' AND ' . implode(' AND ', $matches);
|
||||
}
|
||||
|
||||
$data = self::query($sql);
|
||||
return (!is_array($data) || empty($data)) ? array() : current($data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Liefert ein mehrdimensionales, assoziatives Array mit allen Datensätzen, die zum Filter passen
|
||||
* als Schlüssel der ersten Dimension dient der Wert des Primär-Schlüssels der Datenbank-Tabelle
|
||||
* Legt alle Daten in self::$data ab
|
||||
* Setzt den Filter für die Datenbank zur späteren Verwendung
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @see self::query()
|
||||
* @see self::$data
|
||||
*
|
||||
* @return array
|
||||
* @param string $filter
|
||||
*/
|
||||
final public static function getIndex()
|
||||
public static function setFilter($filter)
|
||||
{
|
||||
$sql = 'SELECT * FROM ' . static::TBL_NAME . ' WHERE ' . static::$filter . ' ' . static::ORDER_BY . ';';
|
||||
self::$data = self::query($sql);
|
||||
return self::$data;
|
||||
static::$filter = $filter;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Liefert ein mehrdimensionales, assoziatives Array mit allen Datensätzen, die zum SQL-Query passen
|
||||
* als Schlüssel der ersten Dimension dient der Wert des Primär-Schlüssels der Datenbank-Tabelle
|
||||
* Funktion, die vor dem Erstellen eines Datenbank-Eintrags ausgeführt wird
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param string $sql
|
||||
* @return array
|
||||
* @param array $request
|
||||
*/
|
||||
final protected static function query($sql)
|
||||
protected static function beforeInsert(array &$request)
|
||||
{
|
||||
self::getInstance();
|
||||
$result = self::$db->query($sql);
|
||||
$data = array();
|
||||
while ($tmpData = $result->fetch_assoc())
|
||||
{
|
||||
$data[$tmpData[static::PRIMARY_KEY]] = $tmpData;
|
||||
}
|
||||
}
|
||||
|
||||
return $data;
|
||||
|
||||
/**
|
||||
* Funktion, die vor dem Löschen eines Datenbank-Eintrags ausgeführt wird
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param int $id
|
||||
*/
|
||||
protected static function beforeDelete($id)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Funktion, die vor dem Update eines Datenbank-Eintrags ausgeführt wird
|
||||
* @author Christian Steinle
|
||||
*
|
||||
* @param array $request
|
||||
*/
|
||||
protected static function beforeUpdate(array &$request)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Schützen, um das Klonen des Singletons zu vermeiden
|
||||
* @author Christian Steinle
|
||||
*/
|
||||
final protected function __clone()
|
||||
{
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user