This is an old revision of the document!


Zugriff auf Tabellen mit TableAccess

Für den Zugriff auf einzelne Datensätze aus Datenbanktabellen stellt Admidio die TableAccess-Zugriffsklasse zur Verfügung. Damit wird der Zugriff und die Pflege einzelner Datensätze erheblich vereinfacht.

Die Klasse kann auf jede Datenbanktabelle angewandt werden. Willst du z.B. mit einem Datensatz der Tabelle MeineTabelle arbeiten:

CREATE TABLE adm_MeineTabelle
(
   meine_id            INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
   meine_name          VARCHAR(255)     NOT NULL,
   meine_geburtstag    datetime,
   meine_adresse       VARCHAR(255)     NOT NULL
)

, so wird das Objekt wie folgt erstellt:

$meinTabellenObjekt = new TableAccess($g_db, 'MeineTabelle', 'meine', 5);

$g_db ist dabei das Admidio-Objekt für den Zugriff auf die Datenbank
MeineTabelle ist der Tabellenname der Tabelle auf die Zugegriffen werden soll
meine ist das Spaltenpräfix der Tabelle
5 wäre in diesem Fall die Nummer der meine_id, die ausgelesen werden soll. Dieser Parameter ist optional und kann auch erst einmal nicht angegeben werden. Dann kann später über folgende Methode der Datensatz eingelesen werden:

$meinTabellenObjekt->readData(5);

Ist das Objekt mit einer bestimmten ID eingelesen, so können die Inhalte der einzelnen Spalten wie folgt ausgelesen werden:

$name = $meinTabellenObjekt->getValue('meine_name');
$adresse = $meinTabellenObjekt->getValue('meine_adresse');

Eine Besonderheit gibt es bei Datums- und Zeitspalten. Hier kann als zweiter Parameter das Format (siehe date() ) übergeben werden. Wird es nicht übergeben, so wird automatisch das Format aus den Organisationseinstellungen zurückgegeben.

// Format in Organisationseinstellungen z.B. d.m.Y
$geburtstag = $meinTabellenObjekt->getValue('meine_geburtstag');
echo $geburtstag // 20.02.1983
$geburtstag = $meinTabellenObjekt->getValue('meine_geburtstag', 'Y/m/d');
echo $geburtstag // 1983/02/20

Daten ändern und speichern geht dann so:

$meinTabellenObjekt->setValue('meine_name', 'Mustermann');
$meinTabellenObjekt->setValue('meine_adresse', 'Musterstraße');
$meinTabellenObjekt->save();

Auch beim Speichern gibt es für Datum- und Zeitfelder eine Besonderheit. Hier muss das Datum nach ISO 8601 Y-m-d 1983-02-20 übergeben werden.

Die Tabellenklassen sollen den Zugriff auf die jeweilige Tabelle erleichtern und außerdem tabellenspezifische Methoden zur Verfügung stellen. Mit Hilfe der Tabellenklassen sollte es daher nicht mehr nötig sein, selber INSERT oder UPDATE Befehle erstellen zu müssen. (Ausnahmen sind hier Massenupdates/-inserts) Die Tabellenklasse ist so intelligent, dass sie nur Updates/Insert macht, wenn dies nötig ist. Außerdem werden noch allgemeine Wertprüfungen gemacht, welche in jeder Klasse noch verfeinert bzw. erweitert werden können um so auch inhaltliche Prüfungen zu ermöglichen.

Seit der Version 2.0 sind die vorhandenen Tabellenklassen überarbeitet und einige Neue hinzugefügt. Sinn der Überarbeitung war die wiederholenden Methoden, welche in jeder Klasse vorkamen in eine übergeordnete Klasse TableAccess auszugliedern und in den jeweiligen Tabellenklassen dann nur noch die spezifischen Dinge zu implementieren.

Mit Version 2.2 muss die Klasse TableAccess nicht mehr für jede Datenbanktabelle abgeleitet werden. Über den neu hinzugefügten Konstruktor in TableAccess kann nun bei entsprechender Übergabe des Tabellennamens und des Spaltenpräfix ein Objekt einer beliebigen Tabelle erzeugt werden. Sofern man keine speziellen Anforderungen beim Befüllen, Auslesen, Speichern oder Löschen braucht reicht dies vollkommen aus und man kann mit den unten beschriebenen Funktionen in der Tabelle arbeiten.

Sollen allerdings abhängige Daten mit gelöscht oder beim Speichern bestimmte Spalten automatisch mit einem aktuellen Zeitstempel befüllt werden, so muss die Klasse abgeleitet und die einzelnen Funktionen ggf. überschrieben werden. Im Konstruktor der abgeleiteten Klasse muss dann der Konstruktor von TableAccess mit den entsprechenden Übergaben aufgerufen werden. Danach kann jede beliebige Methode überschrieben werden.

Ein gutes Beispiel für eine abgeleitete Klasse ist TableGuestbook-Klasse:

public function __construct(&$db, $gbo_id = 0)
{
    parent::__construct($db, TBL_GUESTBOOK, 'gbo', $gbo_id);
}

Mit diesen Informationen funktionieren dann auch schon alle Methoden der TableAccess-Klasse:

  • readData liest den entsprechenden Datensatz aus der Datenbank aus. Mit speziellen Übergaben kann hier das SQL-Statement noch verändert werden (Bsp: roles_class.php)
  • clear initialisiert alle eingelesenen Daten. Die Methode kann in der spezifischen Klasse abgeleitet werden um dort dann noch weitere Daten zu initialisieren (Bsp: organization_class.php)
  • setArray hat man selber die Daten vorher in ein Array eingelesen, kann man dieses Array an die Klasse übergeben und diese arbeitet dann mit den Daten weiter. Macht Sinn, wenn man Daten im Script über eine Schleife einliest, aber auf Methoden der Klasse zugreifen will
  • setValue will man einen Wert verändern, sollte dies über diese Methode laufen. Die Methode kann in der spezifischen Klasse abgeleitet werden um dort spezielle Prüfungen z.B. is_numeric auf übergebene Daten anzuwenden (Bsp: roles_class.php)
  • getValue gibt einen Wert zurück. Die Methode kann in der spezifischen Klasse abgeleitet werden um dort ggf. noch andere Daten zu setzen (Bsp: users_class.php)
  • save die Methode prüft, ob Daten verändert wurden und diese in die Datenbank zurückgeschrieben werden müssen. Die Methode kann in der spezifischen Klasse abgeleitet werden, falls vor einem Update/Insert noch Daten vorbelegt werden sollen/können. Macht z.B. Sinn, wenn der User mit Uhrzeit gespeichert wird, der die letzte Änderung gemacht hat. (Bsp: dates_class.php)
  • delete löscht den aktuellen Satz aus der Datenbank. Die Methode kann in der spezifischen Klasse abgeleitet werden, falls vorher noch andere Daten (Referenzen) gelöscht oder verändert werden müssen (Bsp: roles_class.php)

Intern werden alle aus der Tabelle ausgelesenen Daten in einem Array $db_fields gespeichert. Wer also an bestimmten Stellen schnellern Zugriff auf alle Daten braucht, kann auch direkt auf das Array zugreifen.

  • de/entwickler/tabellenzugriffsklassen.1267959606.txt.gz
  • Last modified: 2010/03/07 12:00
  • by fasse