Contao-Camp 2024
Ergebnis 1 bis 13 von 13

Thema: Lesezugriff auf externe Datenbank / config-Daten auslagern / AJAX-Zugriff

  1. #1
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard Lesezugriff auf externe Datenbank / config-Daten auslagern / AJAX-Zugriff

    Hallo,

    ich möchte auf meiner contao4-Website Daten aus einer externen Datenbank nur lesen und anzeigen.

    Es klappt bislang ganz gut mit der template-Variante {{file::meinedatei.php}}.

    Ich würde jetzt aber gerne die DB-Zugangsdaten in eine config-Datei auslagern.

    Wohin und wie mache ich das am besten?

    Viele Grüße,
    conter
    Geändert von conter (03.08.2017 um 13:27 Uhr)

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

    Standard

    Normalerweise definierst du eine zweite Datenbank Verbindung in Symfony folgendermaßen:

    app/config/parameters.yml
    Code:
    parameters:
        …
        second_database_host: …
        second_database_port: …
        second_database_user: …
        second_database_password: …
        second_database_name: …
    app/config/config.yml
    Code:
    doctrine:
        dbal:
            connections:
                second:
                    driver:   pdo_mysql
                    host:     '%second_database_host%'
                    port:     '%second_database_port%'
                    dbname:   '%second_database_name%'
                    user:     '%second_database_user%'
                    password: '%second_database_password%'
                    charset:  UTF8

    Nun kannst du dir die zweite Datenbankverbindung in Contao mit
    PHP-Code:
    $db = \System::getContainer()->get('doctrine.dbal.second_connection'); 
    holen. Alternativ kannst du auch
    PHP-Code:
    $db = \System::getContainer()->get('doctrine')->getConnection('second'); 
    verwenden.
    Geändert von Spooky (27.07.2017 um 13:24 Uhr)

  3. #3
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard

    Hallo Spooky,

    vielen Dank. Habe es so eingetragen, Cache geleert, Dateien bereinigt.

    Er wird bei der ersten Variante folgender Fehler ins log geschrieben

    Code:
    [2017-07-27 13:57:14] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException(code: 0): You have requested a non-existent service "doctrine.dbal.second_connection". Did you mean one of these: "doctrine.dbal.default_connection", "doctrine.dbal.events_connection"? at
    bei der zweiten Variante folgender Fehler:

    Code:
    [2017-07-27 14:04:26] app.CRITICAL: An exception occurred. {"exception":"[object] (InvalidArgumentException(code: 0): Doctrine ORM Connection named "second" does not exist. at
    Hatte mich aber eh schon gewundert, wo der Name "second_connection" bzw "second" herkam bei der doctrine.
    Meine Datenbank-Daten heißen aber auch nicht 'second_database_host' sondern 'kundexy_database_host'.

    Hast du noch eine Idee dazu?

    Viele Grüße,
    conter

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

    Standard

    Zitat Zitat von conter Beitrag anzeigen
    Hatte mich aber eh schon gewundert, wo der Name "second_connection" bzw "second" herkam bei der doctrine.
    Aus dem, was du in der config.yml eingetragen hast. Was genau hast du dort nun eingetragen? Hast du in app/config noch andere config Dateien?

    // ah ich sehe gerade, dass ich mich bei der config.yml verschrieben hatte. Der Name der Datenbankverbindung war "events" statt "second".

  5. #5
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard

    Hallo,

    in app/config liegen nur die beiden Dateien config.yml und parameters.yml

    meine config.yml:

    Code:
    doctrine:
        dbal:
            connections:
                kundexy:
                    driver:   pdo_mysql
                    host:     '%kundexy_host%'
                    port:     '%kundexy_port%'
                    dbname:   '%kundexy_name%'
                    user:     '%kundexy_user%'
                    password: '%kundexy_password%'
                    charset:  UTF8
    und meine parameters.yml:

    Code:
    # This file has been auto-generated during installation
    parameters:
        database_host: localhost
        database_port: 3306
        database_user: db_user_####
        database_password: '#######'
        database_name: ######
        secret: 6ecee79696f32bda3db9a9ff412eb99f6a5f551957fb5aea0a1c6693931c9345
        
        kundexy_host: #####
        kundexy_port: ####
        kundexy_user: ####
        kundexy_password: ####
        kundexy_name: #######
    Interessanterweise gibt mir das log immer noch als Fehler die "second" aus, obwohl ich schon mehrfach cache gelöscht habe über manager und über console.

    log
    Code:
    [2017-07-27 15:43:23] app.CRITICAL: An exception occurred. {"exception":"[object] (Symfony\\Component\\DependencyInjection\\Exception\\ServiceNotFoundException(code: 0): You have requested a non-existent service \"doctrine.dbal.second_connection\". Did you mean this: \"doctrine.dbal.default_connection\"? at
    Wo setzt sich bloß dieser alte Eintrag so fest?

    Viele Grüße
    conter

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

    Standard

    Wie sieht dein PHP Code aus?

  7. #7
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Lachendes Gesicht

    oh, shit!

    Daaa stand noch $db = \System::getContainer()->get('doctrine')->getConnection('second'); drin!

    Jetzt geht es.

    Ganz vielen Dank für deine Hilfe!!

  8. #8
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard Mit AJAX auf die php-Datei im Templates-Ordner zugreifen

    Hallo

    ich habe noch mal ein bisschen weiter experimentiert.
    Das Auslesen und Anzeigen der Daten aus der ext. DB über {{file::test.php}} funktioniert gut.

    Jetzt würde ich gerne so eine php-Datei über Ajax ansprechen, das funktioniert aber leider nicht in templates. Kriege Fehler 500, wohl weil templates ja nicht "von außen" erreichbar ist.
    Ich komme nur in files rein.

    Gibt es da noch eine Möglichkeit?

    Viele Grüße,
    conter

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

    Standard

    Du solltest das in einen Service (welcher Art auch immer) auslagern und in deinem {{file::test.php}} auf diesen Service zugreifen. Eine eigene AJAX Route könntest du so programmieren: https://community.contao.org/de/show...l=1#post440081

  10. #10
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard

    Danke
    da muss ich mich erstmal rein vertiefen ...

    Viele Grüße,
    conter

  11. #11
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard

    Habe jetzt mal eine neue Testumgebung für das Projekt angelegt und auf einmal funktioniert die externe Datenbankvernindung nicht mehr.
    Habe die app/config analog zur ersten siehe oben nur das oben bei der default DB jetzt natürlich was anderes steht.
    Meine php.Datei ist auch die gleiche.

    Ich kriege jetzt den Fehler

    Code:
    [2017-10-05 10:41:13] app.CRITICAL: An exception occurred. {"exception":"[object] (InvalidArgumentException(code: 0): Doctrine ORM Connection named \"kundeyx\" does not exist. at /home/xxx/public_html/c4_v2/vendor/doctrine/common/lib/Doctrine/Common/Persistence/AbstractManagerRegistry.php:125)"} []
    Habe schon die ganzen mir bekannten Fehlerquellen durchsucht, überall steht kundexy.

    Aufgefallen ist mir, dass in der neuen Test-Umgebung
    Code:
    \"kundeyx\" does not exist
    beim Fehler steht, bei der alten Test-Umgebung gab es mal den Fehler
    Code:
    "kundeyx" does not exist
    also ohne die Backslashes. Kann das was bedeuten?

    Muss ich noch etwas definieren außer config und parameters?

    Steh grad etwas auf der Leitung.
    conter

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

    Standard

    Caches hast du gelöscht?

  13. #13
    Contao-Fan
    Registriert seit
    28.02.2011.
    Beiträge
    680

    Standard

    ja, hab ich

    [OK] Cache for the "prod" environment (debug=false) was successfully cleared.

    Aber es ist doch so, dass nur die config-Dateien zuständig sind, oder?

    Nach nochmaligem Hinundherkopieren klappt es jetzt endlich, keine Ahnung, was es war.
    Geändert von conter (05.10.2017 um 13:26 Uhr)

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
  •