Geschrieben von Christian Schnettelker

Schlagwörter: , ,

Zugriff auf die Joomla-Datenbank

Nutzt man Joomla als Content-Management-System bietet es sich an, anstatt mühsam eine eigene MySQL-Datenbank zu verwalten seine Daten einfach in einer eigenen Tabelle der Joomla-Datenbank abzulegen. In einem aktuellen Projekt habe ich dies getan, daher hier einige vielleicht nützliche Beispiele für den Zugriff als PHP-Sourcecode.

Vorbemerkungen

Der Zugriff auf die Joomla-Datenbank ist eigentlich recht gut dokumentiert, die zuständige PHP-Klasse nennt sich „JDatabase“. Die folgenden zwei Seiten waren Grundlage für den (modifizierten) Code:

■ Lesen: https://docs.joomla.org/Selecting_data_using_JDatabase
■ Schreiben, Updaten und Löschen: https://docs.joomla.org/Inserting,_Updating_and_Removing_data_using_JDatabase

Für das Verständnis dieses Artikels wäre es weiter gut, wenn Sie in PHP fit sind und ein paar Grundkenntnisse zu MySQL mitbringen.

Definitionen

Der Übersichtlichkeit halber definiere ich vorab zentral den Namen meiner Tabelle in der Datenbank:

 define( "KARLMAY", "#__karlmay" );

Die Tabelle heißt also <irgendwas>__karlmay, das ‚#‘ respektive <irgendwas> steht für den Tabellenvorsatz, der bei der Installation von Joomla gewählt wurde

Z.B. könnte der vollständige Tabellenname später, wenn Sie per phyMyAdmin nachschauen, ‚qkw__karlmay‘ lauten. Den Tabellennamen „fest zu verdrahten“ wäre natürlich auch möglich, mit ‚#‘ als Platzhalter ist es aber einfacher und schöner.

Joomla initialisieren

Wie schon im Artikel „Sessions in Joomla“ beschrieben erfolgt vor jedem Zugriff zuerst eine Initialisierung des „Joomla Mainframe“. Dies geschieht bei meinem Fall zentral in der folgenden Funktion:

function __joomla_init()
   {
   define( '_JEXEC', 1 );
   define( 'JPATH_BASE', realpath(dirname(__FILE__) . '/..' ));
   define( 'DS', DIRECTORY_SEPARATOR );

   require_once( JPATH_BASE .DS.'includes'.DS.'defines.php' );
   require_once( JPATH_BASE .DS.'includes'.DS.'framework.php' );

   $mainframe =& JFactory::getApplication( 'site' );
   $mainframe->initialise();
   }

Was da genau passiert kann uns egal sein, wichtig wäre, dass Sie die Pfade zu den über require_once() benötigten Dateien „defines.php“ und „framework.php“ korrekt definieren. Klappt das nicht geben Sie den jeweiligen Pfad halt notfalls absolut an.

Tabelle in der Datenbank erzeugen

In der Joomla-Datenbank muss die Tabelle, in der wir Daten ablegen möchten, natürlich vorhanden sein. Entweder können Sie diese Tabelle von Hand mittels phyMyAdmin erzeugen oder über eine PHP-Funktion wie diese:

function TabelleErzeugen()
   {
 __joomla_init();   // Initialisieren
   $db = JFactory::getDbo();   // Datenbankverbindung holen
 
   // Alte Tabelle wenn vorhanden löschen
   $query = "DROP TABLE IF EXISTS `" . KARLMAY . "`";
   $db->setQuery( $query );
   $db->execute();
 
   // Abfrage-Objekt mit den Daten befüllen
   $query = "CREATE TABLE IF NOT EXISTS `" . KARLMAY . "` (

      `id` int(5) NOT NULL AUTO_INCREMENT,
      `person1` varchar(50) NOT NULL,
      `person2` varchar(50) NOT NULL,
      `jahr` int(10) NOT NULL,
      PRIMARY KEY (`id`)

   ) ENGINE=InnoDB DEFAULT CHARSET=utf8;";
 
   // Abfrage ausführen 
   $db->setQuery( $query );
   $db->execute();
   }

Zuerst wird eine alte Version der Tabelle (falls vorhanden) gelöscht und dann eine neue Tabelle mit vier Einträgen angelegt. Beachten Sie, dass ‚id‘ den Zustand AUTO_INCREMENT besitzt, dadurch wird jedes mal, wenn ein neuer Datensatz hinzu kommt, die ‚id‘ um eines erhöht, sodass wir uns darum nicht selber kümmern müssen.

Der Wert in ‚id‘ ist dann auch unser PRIMARY KEY, d.h. der Datensatz ist in dieser Tabelle durch die ID eindeutig identifizierbar.

Datensatz schreiben

Jetzt schreiben wir einen neuen Datensatz in die Datenbank:

function InDatenbankSchreiben()
   {
 __joomla_init();   // Initialisieren
   $db = JFactory::getDbo();   // Datenbankverbindung holen
 
   // Zu schreibende Daten setzen
   $query = $db->getQuery( true );   // Neues Abfrage-Objekt

   $columns = array( 'id','person1','person2','jahr' );
   $values = array( 0,$db->quote( $db->quote( 'Old Shatterhand' ),
                      $db->quote( 'Winnetou' ),
                      $db->quote( 1893 )
   );

   // Abfrage-Objekt mit den Daten befüllen
   $query
     ->insert( $db->quoteName(KARLMAY) )
     ->columns( $db->quoteName($columns) )
     ->values( implode(',', $values) );

   // Abfrage ausführen
   $db->setQuery( $query );
   $db->execute();
   }

Das war es schon, der Datensatz sollte nun mit der ID 1 (MySQL zählt, im Gegensatz zu PHP/C, ab 1) in der Tabelle <irgendwas>__karlmay stehen. Falls Sie sich über die Angabe ‚0′ für ‚id‘ wundern: da die ID dank AUTO_INCREMENT automatisch hochgezählt wird geben wir hier 0 an, da wir ja die nächste ID nicht kennen.

Und noch ein Tipp: statt Inhalte wie „Old Shatterhand“ selber in die korrekten Anführungszeichen zu setzen nutzen Sie besser, siehe oben, die Funktion $db->quote().

Datensatz lesen

Anschließend möchten wir den gerade geschriebenen Datensatz wieder auslesen:

function AusDatenbankLesen()
   {
 __joomla_init();   // Initialisieren
   $db = JFactory::getDbo();   // Datenbankverbindung holen
 
   // Neues Abfrage-Objekt ("Query") erzeugen  
   $query = $db->getQuery( true );
 
   // Kompletten ersten Datensatz (als "Row") lesen
   $query
      ->select( '*' )
      ->from( $db->quoteName(KARLMAY) )
      ->where( $db->quoteName('id') . " = " . $db->quote( 1 ) );

   // Abfrage ausführen
   $db->setQuery( $query );
   $row = $db->loadRow();
   }

Alle Daten stehen nun im Array $row, also ist

  • $row[ 0 ] = 1
  • $row[ 1 ] = „Old Shatterhand“
  • $row[ 2 ] = „Winnetou“
  • $row[ 3 ] = 1893

Zähler hochzählen (Update)

Noch ein Beispiel für das Verändern eines Elements eines bereits geschriebenen Datensatzes. Die folgende Funktion holt den Wert „jahr“, addiert 1 und schreibt den Wert zurück:

function WertErhoehen()
   {
 __joomla_init();   // Initialisieren
   $db = JFactory::getDbo();   // Datenbankverbindung holen
   $query = $db->getQuery( true );
 
   // Alten Wert lesen und merken
   $query
      ->select( 'jahr' )
      ->from( $db->quoteName(KARLMAY) )
      ->where( $db->quoteName('id') . " = " . $db->quote( 1 ) );

   $db->setQuery( $query );
   $iJahr = $db->loadResult();   // Einzelnen Wert lesen

   // Wert um eins erhöht schreiben
   $query = $db->getQuery( true );
 
   $query
      ->update( $db->quoteName(KARLMAY) )
      ->set( $db->quoteName('jahr') . ' = ' . ++$iJahr )
      ->where( $db->quoteName('id') . " = " . $db->quote( 1 ) );

   // Abfrage ausführen
   $db->setQuery( $query );
   $db->execute();
   }

Ich hoffe, dieser kleine Artikel hat etwas weiter geholfen. Falls dem so ist hinterlassen Sie doch eine nette Nachricht.

Kommentare

Kommentare

Kommentar schreiben

Aufgrund neuer rechtlicher Bestimmungen habe ich die Kommentarfunktion meines Blogs vorübergehend deaktiviert und muss Sie vorerst bitten, Kommentare per Email an mail [at] manoftaste.de zu senden.