ZugriffAufExterneDB

Guite edited this page Nov 12, 2014 · 6 revisions
Clone this wiki locally

Zugriff auf eine externe DB ermöglichen

Voranmerkung des Autors: Leider konnte ich die Funktionen noch nicht ausgiebig testen, deshalb nur ein kleiner Einblick und ohne Gewähr

In diesem Wikibeitrag möchte ich meine Erfahrungen teilen auf eine externe Datenbank zugreifen zu können. Dies möchte ich an einem ausführlichen Beispiel erläutern.

Definition der DB in config.php

Damit Zikula mit einer externen Datenbank umgehen kann benötigt es die Zugangsdaten. Diese musst du manuell in der config.php in www.meineseite.de/zikulaverzeichnis/config/ eintragen.

Du wirst vorgefertigte Einträge finden, die du nur noch editieren musst. Das ganze sieht in der config.php folgendermaßen aus:

<?php
// ----------------------------------------------------------------------
// The following define the list of databases the system can access. You
// can define as many as you like provided you give each one a unique
// name (the key value following the DBInfo array element)
// ----------------------------------------------------------------------
$PNConfig['DBInfo']['extdb1']['dbtype'] = 'mysql';        // sample value
$PNConfig['DBInfo']['extdb1']['dbhost'] = 'localhost';        // sample value
$PNConfig['DBInfo']['extdb1']['dbuname'] = 'dbuname';
$PNConfig['DBInfo']['extdb1']['dbpass'] = 'dbpass';
$PNConfig['DBInfo']['extdb1']['dbname'] = 'dbname';        // sample value
$PNConfig['DBInfo']['extdb1']['encoded'] = 1;              // if you like it coded set 1
$PNConfig['DBInfo']['extdb1']['pconnect']  = 0;
// additional DB can be configured here ...

Gib einfach deine Datenbankdaten ein. Den verwendeten Begriff 'extdb1' kannst du nach belieben verändern. Dieser definiert die Bezeichnung mit der du über DBConnectionStack auf deine Datenbank zugreifen kannst.

Ein Tipp: Base64 Codier-/Decodier-Tool damit kannst du deine Daten verschlüsseln. Setzte in dem Fall den Wert 'encoded' auf '1'.

Definition von Prefixen in pntables.php

In pntables.php definierst du deine Tabellen auf die übliche Art. Der Unterschied, weil vermutlich ja keine zk_Tabellen, liegt am Prefix. Diesen habe ich über eine Modul-Variable definiert (Funktion pnModSetVar(), bei Initialisierung & Konfiguration des Modules) und dann wie folgt in [pntables.php|pntables]] eingebracht:

<?php
    $tabellen_prefix = pnModGetVar('meinModul', 'externetabelle_prefix');
    $dbname = $tabellen_prefix . 'tabellenbezeichnung';
    $pntable['meinetabelle'] = $dbname;
    $pntable['meinetabelle_column'] = .... // weiter wie gehabt

Der Zugriff im Code

Zunächsteinmal weiss Zikula nichts von der 2.Datenbank und wird diese in den anderen Modulen auch nicht verwenden. Du musst also in deinem Modulcode zunächst einmal Zikula sagen, dass es mit deiner externen Datenbank arbeiten soll. Dazu nutzt du die Zikula Klasse DBConnectionStack. Das ganze sieht im Code dann folgendermaßen aus:

<?php
DBConnectionStack::init($name='external1');

Dabei ist 'extdb1' die Bezeichnung die wir der Datenbank in der config.php gegeben haben

Die Umsetzung

Ich fasse zusammen:

  • Wir haben in der config.php eine externe DB definiert
  • Wir haben in pntables.php deines Modules alles für DBUtil aufbereitet
  • Und schließlich in unserem Code eine Verbindung mit der Datenbank hergestellt

Jetzt können wir auf übliche Weise mit DBUtil auf die Datenbank zugreifen. Aber Achtung: Der DBConnectionStack:init Befehl muss auf jedenfall vor einem Zugriffsversuch ausgeführt werden. Wenn Du also zwischen verschiedenen Datenbanken hin- und herwechselst, müsstest Du so vorgehen:

<?php
DBConnectionStack::init();
// Zugriff auf die normale Zikula-DB

DBConnectionStack::init('external1');
// Zugriff auf die z.B. OSCommerce-DB

DBConnectionStack::init();
// Zugriff auf die normale Zikula-DB

Nützliche & weiterführende Links