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!
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!
Ja ist möglich. Du kannst bei Database::getInstance die Verbindungsdaten der anderen Datenbank angeben.
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
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
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
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" übereinbinden?HTML-Code:{{file:: neuedb.php}}
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];
}
Du würdest in neuedb.php in etwa das machen
und dann mit $dbinstance arbeiten um mit Deiner Datenbank "zu reden".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);
Contao-Community-Treff Bayern: http://www.contao-bayern.de
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 18:36 Uhr) Grund: Änderung Sachverhalt
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:
Weiter unten im Template verbinde ich dann die erste Datenbank mit:PHP-Code:
$db1 = array(
'dbHost' => 'localhost',
'dbUser' => 'root',
'dbPass' => 'passwort1',
'dbDatabase' => 'db1',
);
$db2 = array(
'dbHost' => 'localhost',
'dbUser' => 'root',
'dbPass' => 'passwort2',
'dbDatabase' => 'db2',
);
Das funktioniert so weit alles bestens!PHP-Code:
$sql = "SELECT * FROM tabelle1 ORDER BY tstamp DESC";
$dbQuery = Database::getInstance($db1)->prepare($sql);
$dbResult = $dbQuery->execute();
Das Problem tauch erst auf, sobald ich noch weiter unten versuche die zweite Datenbank zu verbinden:
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.PHP-Code:
$sql1 = "SELECT * FROM tabelle2 ORDER BY tstamp DESC";
$dbQuery1 = Database::getInstance($db2)->prepare($sql1);
$dbResult1 = $dbQuery1->execute();
Was mache ich hier falsch? Muss ich die Verbindung zu ersten Datenbank zunächst beenden? Wenn ja, wie?
Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Gäste: 1)
Lesezeichen