Herstellen einer Datenbankverbindung innerhalb eines Artikels/Beitrags

  • Hallo zusammen,


    ich habe mal eine Frage. Ich arbeite oftmals mit eigenen PHP Skripten, die ich in Beiträgen einsetze. Als Extension nutze ich dazu "Sourcerer".

    Bisher habe ich nun immer eine Datenhbankverbindung händisch hergestellt. Das sah dann so aus:


    Code
    $pdo = new PDO('mysql:host=localhost;dbname=***;charset=UTF8', '***benutzername***', '***passwort***');



    Anschließend ziehe ich mir dann z. B. Daten über klassische SELECT Abfragen.


    Jetzt frage ich mich, ob es eine Möglichkeit gibt


    Code
    $db = JFactory::getDbo();


    für die Datenbankverbindung zu verwenden, ohne dass ich nun alle Abfragen nach Joomla-Handbuch umbauen müsste? Mir geht es also nur darum, für meine Abfragen die Datenbankverbindung herzustellen mit Hilfe der in Joomla hinterlegten Daten. Geht sowas?

  • Keine Ahnung. Ob dieser Thread ev. passt?

    Wenn nicht, kommt ev. Korrektur von den Experten.


    Liebe Grüße

    Christine

  • Keine Ahnung. Ob dieser Thread ev. passt?

    Wenn nicht, kommt ev. Korrektur von den Experten.


    Liebe Grüße

    Christine

    Vielen Dank, Christine,

    Das hat mir aber mit meiner Frage nicht so richtig geholfen.

    Mir geht es tatsächlich nur um die Herstellung der Datenbankverbindung. Ich möchte die Verbindung nicht händisch herstellen, sondern auf die Daten der Joomla Installation zurückgreifen. Das ist auch möglich. Ich fürchte nur, dass ich dann alle meine Abfragen, Inserts und Updates ändern muss und ich wollte zunächst einmal fragen, ob es noch eine andere Lösung gibt.

  • Nachfolgendes hat zwar nichts mit der Frage in #1 zu tun,

    ist aber eventuell auch nützlich:


    Joomla-DB-API: Frage zu Prepared Statement versus plumpem Typecasting


    Joomla 4: Erleichterte Datenbankabfragen für "WHERE IN" – GHSVS-Dein Web mit Mehr
    Prepared Statements sind bei DB-Abfragen seit Joomla 4 Core-Standard. Auch die whereIn()-Methode nutzt sie automatisch.
    ghsvs.de


    JFactory::getDbo()-Ersatz ab Joomla 4 – GHSVS-Dein Web mit Mehr
    Joomla 4: Veraltete Schreibweisen "JFactory::getDbo()" zum Erstellen eines Datenbank-Objekts bzw. einer Datenbankverbindung geändert.
    ghsvs.de


    Übrigens gibt es meiner Meinung nach kaum einen Grund für PHP-Code in Beiträgen den Sourcerer zu verwenden weil ja auch per Modul in Beitrag möglich. Siehe diesbezüglich z.B. auch:


    Joomla-Modul-Override für Einbinden beliebiger Codes - GHSVS-Dein Web mit Mehr
    Mit eigenem Modul-Override + Joomla-Plugin "loadmodule" in Beiträge jedweden Code laden. Oder Joomla-Framework in PHP ohne Extracode nutzen.
    ghsvs.de

  • Wenn du es auch noch in Joomla6 verwenden möchtest dann beachte das obiges deprecated ist und verwende z.B. wohl:


    Code
    use Joomla\CMS\Factory;
    
    Factory::getApplication->getConfig();

    und siehe diesbezüglich z.B. eventuell wohl auch:


    github.com/joomla/joomla-cms/blob/4.3.4/libraries/src/Service/Provider/Database.php

  • Danke für deine Hilfe, Sieger66,

    ich komme aber noch nicht ganz klar.


    Wie muss ich die Options abrufen und einbauen?


    Habe mehrere Dinge versucht, funkt aber nicht. Aktuell stehe ich bei diesem Versuch:


    Code
    use Joomla\CMS\Factory;
    
    Factory::getApplication->getConfig();
    
    $pdo = new PDO('mysql:host=$conf->get($host);dbname=$conf->get($db);charset=UTF8', $conf->get($user), $conf->get($password));


    Nicht lachen, wird grundfalsch sein, nicht umsonst erhalte ich eine Fehlermeldung. Aber das ist mir aktuell vom Verständnis her noch zu hoch.

  • Mir geht es also nur darum, für meine Abfragen die Datenbankverbindung herzustellen mit Hilfe der in Joomla hinterlegten Daten. Geht sowas?

    Nicht mein Fachgebiet. Deshalb nur so eine Idee. Ist das überhaupt nötig? Eine DB-Verbindung besteht doch bereits- Der Beitrag wird doch selber auch schon aus der DB abgerufen.

    Oder sollte es um eine externe DB gehen?

    Oder möchtest du die Zugangsdaten für eine externe DB in einer Tabelle in der Joomla-DB hinterlegen? hmm

  • In #7 und #8 fehlt () hinter Application und ist mir durch copy and paste von dort:


    github.com/joomla/joomla-cms/blob/4.3.4/libraries/src/Factory.php#L556


    nicht aufgefallen.


    Code
    use Joomla\CMS\Factory;
    
    $conf = Factory::getApplication()->getConfig(); 
    $user = $conf->get('user');
    $password = $conf->get('password');

    was du benötigst kannst du ja z.B. auch per anschließendem:


    Code
    print "<pre>";
    print_r($conf); 
    print "</pre>"; 

    ermitteln. Dies natürlich nur für Berechtigte und nicht öffentlich ausgeben!

  • Z.B. in einem Beitrag der Zugriffsebene Special oder besser eine Zugriffsebene nur für entsprechende "Superuser" benutzen,

    weil die gesammte Konfigurationsdaten werden ja damit ausgegeben bzw. angezeigt.

    Per anschließendem "Seitenquelltext anzeigen" siehst du diese übrigens dann gegebenenfalls etwas leichter lesbar.

    Kannst aber z.B. auch in #6 meinen ersten Link nutzen. :)

  • Sieger66 , vielen Dank! Das hat bereits sehr geholfen, wobei ich auch selbst bereits einen dummen Fehler begannen hatte, auf den ich auch hätte selbst kommen können... Aktuell läuft die Verbindung aber noch nicht. Meine Zeilen sehen nun so aus:


    Code
    use Joomla\CMS\Factory;
    
    $conf = Factory::getApplication()->getConfig();
    $host = $conf->get('host');
    $db = $conf->get('db');
    $user_db = $conf->get('user');
    $password_db = $conf->get('password');
    
    $pdo = new PDO('mysql:host=$host;dbname=$db;charset=UTF8', '$user_db', '$password_db');


    Fehlermeldung:

    2002

    SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known

    Die Variablen $host, $db, $user_db und $password_db habe ich testweise einmal ausgegeben, um zu schauen, ob die korrekten Daten gezogen und ausgegeben werden. Das war der Fall. Die Variablen sind also korrekt "befüllt".



    JoomlaWunder


    Nicht mein Fachgebiet. Deshalb nur so eine Idee. Ist das überhaupt nötig? Eine DB-Verbindung besteht doch bereits- Der Beitrag wird doch selber auch schon aus der DB abgerufen.

    Oder sollte es um eine externe DB gehen?

    Oder möchtest du die Zugangsdaten für eine externe DB in einer Tabelle in der Joomla-DB hinterlegen? hmm


    Das ist ja eigentlich genau das, was ich am liebsten wollte. Ich dachte mir auch, dass eine DB-Verbindung bereits bestehen muss. Aber wie greife ich auf die DB-Verbindung innerhalb meiner SELECT-Abfragen zu? Ich muss Tabellen innerhalb der Joomla-DB abfragen, also nix externes... Erleuchtung gerne erwünscht.


    Beispiel einer Abfrage:


    Code
    $query = "SELECT Spalte FROM Joomla-Tabelle-X GROUP BY Spalte";
    foreach ($pdo->query($query) as $row)
    {
    ...
    }


    $pdo war die Datenbankverbindung...

  • Um das Problem zu finden ersetze in deiner Zeile 9 zum testen die vorhandenen Variablen nach und nach durch die direkten Konfigurations-Zugangswerte, so wie sie in der bereits funktionierenden Version wie in #1 von dir genannt vorhanden. Ich würde z.B. mit host beginnen.


    mysql:host=localhost;

  • Ich sehe gerade noch das nachfolgende Variablen wohl ohne die Anführungszeichen in deiner Zeile 9 verwendet werden sollten:


    Code
    '$user_db', '$password_db'

    Habe es aber selbst noch nie benutzt oder getestet.


    Eventuell nützlich:

    Zitat

    The driver specific error code and message ("php_network_getaddresses: getaddrinfo failed: Name or service not known") tell you that PDO is not able to resolve the host name.

  • Kannst ja aber wohl auch einfach eine Datenbankverbindung verwenden und deine query übergeben wie z.B. bei nachfolgendem Muster:



    Ich weiß aber nicht ob das so auch im Beitrag per Sourcerer funktioniert.


    Siehe übrigens z.B. auch:

    J4.x: Nutzung von JDatabase für Datenabfragen – Joomla! Documentation

    wobei dort noch die ältere deprecated Variante $db = Factory::getDbo(); zur Datenbankverbindung verwendet wird.

    Diesbezüglich habe ich dir auch schon in #4 etwas verlinkt. Siehe z.B. auch:


    Inserting, Updating and Removing data using JDatabase – Joomla! Documentation

  • Sieger66 vielen Dank für den vielen Support.


    Habe es nun gelöst bekommen.


    Für die Nachwelt, die Lösung sieht wie folgt aus:


    Code
    use Joomla\CMS\Factory;
    
    $conf = Factory::getApplication()->getConfig();
    $host = $conf->get('host');
    $db = $conf->get('db');
    $user_db = $conf->get('user');
    $password_db = $conf->get('password');
    
    $pdo = new PDO('mysql:host='.$hostlocal.';dbname='.$db.';charset=UTF8', $user_db, $password_db);


    Ich wusste leider nicht, mit welchem identifier man das charset mittels $conf->get ausliest, sonst hätte ich das auch noch gemacht. So funktioniert es aber nun zumindest.


    Eleganter wäre nach wie vor, eine etwaig vorhandene Datenbankverbindung zu nutzen. Dazu hätte ich aber nun sämtliche Abfragen umschreiben müssen. Dazu hatte ich keine Lust. Das werde ich aber noch nachholen.


    Herzlichen Dank!

  • Also nur alle "Texte" korrekt in Anführungszeichen setzen sowie die Variablen korrekt verketten und schon geht es...


    charset kann ja wohl nicht per $conf->get in der configuration.php geholt werden da dort ja gar nicht vorhanden.


    charset wird von joomla wohl "je nachdem ermittelt und verwendet", siehe hierzu wohl z.B.:


    github.com/joomla-framework/database/blob/2.1.1/src/Pdo/PdoDriver.php#L220-L241

    sowie und in der selben Datei auch die Zeilen 350 bis 361:

    github.com/joomla-framework/database/blob/2.1.1/src/Pdo/PdoDriver.php#L350-L361


    Ich bin aber nur Laie und kenne mich mit Datenbankverbindungen usw. kaum aus.