Lukas .: Mehrere Datenbanken in einem Script abfragen?

Hi,

ich müsste in php-script mehrere Datenbanken abfragen. Gibt es hierzu eine schlauere Vorgehensweise als die DBs nacheinander mit den entsprechenden Zugangsdaten zu öffnen, abzufragen und wieder zu schließen?

Lukas

  1. Tach!

    ich müsste in php-script mehrere Datenbanken abfragen. Gibt es hierzu eine schlauere Vorgehensweise als die DBs nacheinander mit den entsprechenden Zugangsdaten zu öffnen, abzufragen und wieder zu schließen?

    Ja, es ist kein Problem, mehrere Datenbank-Verbindungen zu öffnen und offen zu halten. Bei mysqli ist es gar nicht anders möglich, als das Handle zur einer Verbindung in einer Variable abzulegen und jeder Funktion zu übergeben. Beim alten, mittlerweile missbilligten mysql war die Übergabe der Verbindung optional.

    dedlfix.

    1. Hi dedlfix,

      Ja, es ist kein Problem, mehrere Datenbank-Verbindungen zu öffnen und offen zu halten. Bei mysqli ist es gar nicht anders möglich, als das Handle zur einer Verbindung in einer Variable abzulegen und jeder Funktion zu übergeben. Beim alten, mittlerweile missbilligten mysql war die Übergabe der Verbindung optional.

      Ich nutze inzwischen das PDO Objekt.

      Würde also ungefähr so vorgehen:

      $pdo1 = new PDO('mysql:host=localhost;dbname=datenbankname', 'username', 'passwort');
      $pdo2 = new PDO('mysql:host=localhost;dbname=datenbankname', 'username', 'passwort');
      $pdo3 = new PDO('mysql:host=localhost;dbname=datenbankname', 'username', 'passwort');
      // hier die Verbindungen nutzen
      ...
      ...
      // Verbindungen schließen
      $pdo1 = null;
      $pdo2 = null;
      $pdo3 = null;
      

      Korrekt?

      Lukas

      1. Tach!

        Ich nutze inzwischen das PDO Objekt. Würde also ungefähr so vorgehen: [...] Korrekt?

        Ja.

        dedlfix.

      2. Moin!

        Hi dedlfix,

        Ja, es ist kein Problem, mehrere Datenbank-Verbindungen zu öffnen und offen zu halten. Bei mysqli ist es gar nicht anders möglich, als das Handle zur einer Verbindung in einer Variable abzulegen und jeder Funktion zu übergeben. Beim alten, mittlerweile missbilligten mysql war die Übergabe der Verbindung optional.

        Ich nutze inzwischen das PDO Objekt.

        Würde also ungefähr so vorgehen:

        $pdo1 = new PDO('mysql:host=localhost;dbname=datenbankname', 'username', 'passwort');
        $pdo2 = new PDO('mysql:host=localhost;dbname=datenbankname', 'username', 'passwort');
        $pdo3 = new PDO('mysql:host=localhost;dbname=datenbankname', 'username', 'passwort');
        // hier die Verbindungen nutzen
        

        Korrekt?

        Nein! Ist zu viel.

        Weil es immer gleiche Server hier:localhost ist. In diesem speziellen Fall (und wenn die Rechts stimmen!) braucht es keine weitere Verbindung und das ist auch schädlich, weil die Anzahl der Verbindungen a) limitiert ist und b) jede einzelne Ressourcen beansprucht.

        Du kannst die Verbindung einfach mit

        $pdo = new PDO('mysql:host=localhost', 'username', 'passwort');
        

        aufbauen und Deine SQL-Statements so gestalten:

        statt: $sql="select foo bar from tock";

        dann: $sql="select foo bar from datenbankname.tock";

        Du verknüpfst also die Tabellen mit den Datenbanken.

        Es wäre noch zu erwähnen, dass Du natürlich auch das statement use datenbankname vor jeder wirklichen Abfrage an den Server schicken kannst. Aber auch das wäre hyperliquid.

        Jörg Reinholz

        1. Hi,

          statt: $sql="select foo bar from tock";

          dann: $sql="select foo bar from datenbankname.tock"

          Du verknüpfst also die Tabellen mit den Datenbanken.

          Ah, ok, verstehe. Und stimmt, in meinem Fall wird wirklich immer in derselben DB mit jeweils unterschiedlichen dbnamen gearbeitet.

          Probier ich so aus.

          Lukas

          1. Ah, ok, verstehe. Und stimmt, in meinem Fall wird wirklich immer in derselben DB mit jeweils unterschiedlichen dbnamen gearbeitet.

            Probier ich so aus.

            ... funktioniert aber nur mit dem DB-Masterpasswort, stimmts?

            Lukas

            1. Moin!

              ... funktioniert aber nur mit dem DB-Masterpasswort, stimmts?

              Kann man so nicht sagen. Natürlich braucht der angemeldete Benutzer jeweils Rechte an den befragten oder beschickten Datenbanken.

              Wenn Du jetzt aber als Spezialfall verschiedene Datenbanken des selben Hosters hast, an denen jeweils nur genau ein Benutzer Rechte hat, dann hast Du zwei Varianten:

              1.) (besser) Der Hoster legt Dir einen Benutzer mit Rechten an allen Deinen Datenbanken an.
              2.) (sehr viel schlechter) So viele Verbindungen wie benötigt.

              Die Variante 1 dürfte auch im Interesse des Hosters sein...

              Jörg Reinholz

            2. Tach!

              Und stimmt, in meinem Fall wird wirklich immer in derselben DB mit jeweils unterschiedlichen dbnamen gearbeitet.

              Du hast offensichtlich das Wort Datenbank missverständlich verwendet. Das passiert öfter und ich mach das ja auch gelegentlich. Eigentlich willst du zwischen Datenbank-Server und den eigentlichen Datenbanken unterscheiden. In deinem Fall ist es also so, dass der Server derselbe ist, aber die Datenbanken unterschiedliche sind.

              ... funktioniert aber nur mit dem DB-Masterpasswort, stimmts?

              Natürlich. Das wäre ja noch schöner, wenn man man als normalsterblicher Nutzer auf die Datenbanken der anderen zugreifen kann. Allerdings braucht es dazu nicht das "Masterpasswort", du kannst auch einen Benutzer anlegen, der Zugriff auf genau die abzufragenden Datenbanken bekommt und nicht mehr.

              Ansonsten musst du doch pro Nutzer für seine eigene Datenbank eine eigene Verbindung aufbauen.

              dedlfix.

              1. Du hast offensichtlich das Wort Datenbank missverständlich verwendet. Das passiert öfter und ich mach das ja auch gelegentlich. Eigentlich willst du zwischen Datenbank-Server und den eigentlichen Datenbanken unterscheiden. In deinem Fall ist es also so, dass der Server derselbe ist, aber die Datenbanken unterschiedliche sind.

                Ja, genau so ist es.

                @dedlfix @Jörg

                Leider mußte ich die Verbindung doch in einer Schleife öffnen, bearbeiten und schließen. Der Masterzugang funktioniert zwar auf alle Datenbanken, aber leider kann ich die DBs nicht über "dbname.tabelle" ansprechen. Ich habe alles versucht, auch über phpmyadmin, es funktioniert nicht, weil anscheinend die Rechte nicht entsprechend vergeben sind.

                Daher mußte ich per Schleife (alledings mit Masterpasswort) die DBs anwählen und bearbeiten, so gings, anders leider nicht.

                Danke für Eure Hilfe

                Lukasc

                1. Moin!

                  Der Masterzugang funktioniert zwar auf alle Datenbanken,

                  Hm? "Master"? Ich kenne einen gewissen "root" als Verwalter der Rechte, aber wie jedes andere Recht auch kann das Recht, Rechte an Datenbanken zu verwalten, vom root an einen "Master" vergeben werden.

                  Benutze genau einen Zugang und vergib also die Rechte.

                  Jörg Reinholz

                  1. Hm? "Master"? Ich kenne einen gewissen "root" als Verwalter der Rechte, aber wie jedes andere Recht auch kann das Recht, Rechte an Datenbanken zu verwalten, vom root an einen "Master" vergeben werden.

                    Benutze genau einen Zugang und vergib also die Rechte.

                    Ich darf das nicht. Das darf nur der Provider. Aber ich frag da am Montag mal nach.

                    Lukas