Contao-Camp 2024
Ergebnis 1 bis 9 von 9

Thema: Zusätzliche/externe DB in Contao 3 einbinden?

  1. #1
    Contao-Nutzer
    Registriert seit
    04.07.2013.
    Beiträge
    24

    Standard Zusätzliche/externe DB in Contao 3 einbinden?

    Hallo zusammen,

    ich möchte zusätzlich zu meiner Contao-Datenbank auf eine weitere Datenbank, die sich auf meinem Server befindet, zugreifen.
    Ist das überhaupt möglich und wenn ja, wie?

    Danke!

  2. #2
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.896
    Partner-ID
    10107

    Standard

    Ja ist möglich. Du kannst bei Database::getInstance die Verbindungsdaten der anderen Datenbank angeben.

  3. #3
    Contao-Nutzer
    Registriert seit
    04.07.2013.
    Beiträge
    24

    Standard

    Danke Spooky schon mal für die Antwort. Hast du noch einen kleinen Tipp für mich wo ich Database::getInstance benutze? Einfach als PHP-file in templates? Google führt mich in der Angelegenheit nur in die Irre. Wenn du ein wenig elaborieren könntest, wäre das super

  4. #4
    Wandelndes Contao-Lexikon Avatar von BugBuster
    Registriert seit
    15.06.2009.
    Ort
    Berlin
    Beiträge
    10.494
    User beschenken
    Wunschliste

    Standard

    z.B. im Rahmen einer Erweiterung. Dort wird ja genau so eine DB Verbindung aufgebaut. Nur kannst du wohl hier noch Parameter mitgeben für eine weitere Verbindung.
    Grüße, BugBuster
    "view source" is your guide.
    Danke an alle Amazon Wunschlisten Erfüller

  5. #5
    Community-Moderator
    Wandelndes Contao-Lexikon
    Avatar von Spooky
    Registriert seit
    12.04.2012.
    Ort
    Scotland
    Beiträge
    33.896
    Partner-ID
    10107

    Standard

    Zitat Zitat von Muckaveli Beitrag anzeigen
    Danke Spooky schon mal für die Antwort. Hast du noch einen kleinen Tipp für mich wo ich Database::getInstance benutze? Einfach als PHP-file in templates? Google führt mich in der Angelegenheit nur in die Irre. Wenn du ein wenig elaborieren könntest, wäre das super
    Naja, wo du den Zugriff auf die anderen Datenbank brauchst musst du ja selbst wissen . Die du \Contao\Database::getInstance() mit Parametern benutzt kannst du dir im Source ansehen: https://github.com/contao/core/blob/....php#L130-L169

  6. #6
    Contao-Nutzer
    Registriert seit
    04.07.2013.
    Beiträge
    24

    Standard

    Danke schon mal für die weiteren Hinweise.
    Ich bin allerdings noch ein Anfänger und würde euch bitten mich noch ein klein wenig mehr an die Hand zu nehmen

    Kann ich diesen Code hier nehmen, die Zugangsdaten direkt in das Array eintragen (anstatt der derzeitigen Variabeln) und das Ganz dann in "neuedb.php" über
    HTML-Code:
    {{file:: neuedb.php}}
    einbinden?



    PHP-Code:
     Instantiate the Database object (Factory)
         *
         * @
    param array $arrCustom A configuration array
         *
         * @return \
    Database The Database object
         
    */
        public static function 
    getInstance(array $arrCustom=null)
        {
            
    $arrConfig = array
            (
                
    'dbDriver'   => \Config::get('dbDriver'),
                
    'dbHost'     => 'localhost',
                
    'dbUser'     => 'username',
                
    'dbPass'     => 'passwort',
                
    'dbDatabase' => 'datenbank',
                
    'dbPconnect' => \Config::get('dbPconnect'),
                
    'dbCharset'  => \Config::get('dbCharset'),
                
    'dbPort'     => \Config::get('dbPort'),
                
    'dbSocket'   => \Config::get('dbSocket'),
                
    'dbSqlMode'  => \Config::get('dbSqlMode')
            );
            if (
    is_array($arrCustom))
            {
                
    $arrConfig array_merge($arrConfig$arrCustom);
            }
            
    // Sort the array before generating the key
            
    ksort($arrConfig);
            
    $strKey md5(implode(''$arrConfig));
            if (!isset(static::
    $arrInstances[$strKey]))
            {
                
    $strClass 'Database\\' str_replace(' ''_'ucwords(str_replace('_'' 'strtolower($arrConfig['dbDriver']))));
                static::
    $arrInstances[$strKey] = new $strClass($arrConfig);
            }
            return static::
    $arrInstances[$strKey];
        } 

  7. #7
    Contao-Urgestein Avatar von fiedsch
    Registriert seit
    09.07.2009.
    Ort
    München
    Beiträge
    2.935

    Standard

    Du würdest in neuedb.php in etwa das machen

    PHP-Code:
    $myDbConfig = array 
            ( 
                
    'dbUser'     => 'mein_username_für_die andere_Datenbank'
                
    'dbPass'     => 'passwort_dazu'
                
    'dbDatabase' => 'Name_der_anderen_Datenbank'
            ); 

    $dbinstance = \Contao\Database::getInstance($myDbConfig); 
    und dann mit $dbinstance arbeiten um mit Deiner Datenbank "zu reden".
    Contao-Community-Treff Bayern: http://www.contao-bayern.de

  8. #8
    Contao-Nutzer
    Registriert seit
    04.07.2013.
    Beiträge
    24

    Standard

    Danke fiedsch!

    Mit deiner Erklärung konnte ich eine Verbindung zur zweiten DB aufbauen.
    Als ich den error.log nach ca. 1 Stunde richtig herum las (neuster Log ganz unten in der Datei ), fand ich das Problem.

    Oben in meinem Template habe ich die Verbindung zu der zweiten DB erfolgreich aufgebaut.
    Weiter unten im Template brauche ich zusätzliche Daten aus der originalen Contao-DB.
    Diese Abfrage verursacht allerdings einen Error, da mein Code nach einer gewissen Tabelle - durch die obere DB Verbindung - in der zweiten DB, anstatt in der Contao-DB sucht.

    Ich versuche jetzt gerade zu verhindern, dass meine obere DB Verbindung die untere überschreibt.
    Geändert von Muckaveli (06.10.2019 um 19:36 Uhr) Grund: Änderung Sachverhalt

  9. #9
    Contao-Nutzer
    Registriert seit
    04.07.2013.
    Beiträge
    24

    Gesicht zeigt die Zunge

    Das ursprüngliche Problem "wie baue ich die Verbindung zu einer externen DB auf?" ist jetzt wohl gelöst.

    Mein neues Problem ist: "Wie baue ich die Verbindung zu zwei unterschiedlichen Datenbanken im selben template auf?".

    Momentan sieht mein Code wie folgt aus:

    PHP-Code:
    $db1 = array(
              
    'dbHost' => 'localhost',
              
    'dbUser' => 'root',
              
    'dbPass' => 'passwort1',
              
    'dbDatabase' => 'db1',
        );
        
        
    $db2 = array(
              
    'dbHost' => 'localhost',
              
    'dbUser' => 'root',
              
    'dbPass' => 'passwort2',
              
    'dbDatabase' => 'db2',
        ); 
    Weiter unten im Template verbinde ich dann die erste Datenbank mit:

    PHP-Code:
    $sql "SELECT * FROM tabelle1 ORDER BY tstamp DESC"
        
    $dbQuery Database::getInstance($db1)->prepare($sql); 
        
    $dbResult $dbQuery->execute(); 
    Das funktioniert so weit alles bestens!
    Das Problem tauch erst auf, sobald ich noch weiter unten versuche die zweite Datenbank zu verbinden:

    PHP-Code:
    $sql1 "SELECT * FROM tabelle2 ORDER BY tstamp DESC"
        
    $dbQuery1 Database::getInstance($db2)->prepare($sql1); 
        
    $dbResult1 $dbQuery1->execute(); 
    Dann erscheint plötzlich die gewohnte Contao PHP-Fehlerbox "Es ist ein Fehler aufgetreten". Und der Error.log besagt, dass tabelle2 aus DB2 nicht in DB1 gefunden werden kann. Es scheint also so, als würde der zweite Query zwar akzeptiert werden, die zweiten Zugangsdaten ($db2) jedoch irgnoriert werden. Deshalb wird tabelle2 nicht in der zweiten, sondern der ersten Datenbank gesucht.

    Was mache ich hier falsch? Muss ich die Verbindung zu ersten Datenbank zunächst beenden? Wenn ja, wie?

Aktive Benutzer

Aktive Benutzer

Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)

Lesezeichen

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •