SmartyShark: Datenbank - Id´s über Localhost und externer Server

Hallo,

hab mal eine Frage.

Ich habe eine Datenbankklassen mit deren Unterklassen. Jedenfalls
will ich folgendes machen:

$db_login = new dbLoginQueries(null,null,null,null);  $db_srvtools = new dbSrvToolsQueries("127.0.0.1",null,null,null);
$db_iptraff = new
dbSrvToolsQueries("111.111.122.201","3306","testtable","userid","userpwd");
So die ersten zwei handles funktionieren wunderbar, d.h. ich bekomme
einmal einen handle zurück für die Klasse dbLoginQueries und einmal
für die Klasse dbSrvToolsQueries, aber beide verweisen auf dieselbe Datenbanke(z.b. test) auf dem Localhost. Der dritte Handle
soll mir aber eine ID von einer anderen Datenbank auf einem anderen Server geben. Das Problem ist, das wenn die dritte Anweisung ausgeführt wird, ich den localhost handle wieder zurückbekomme.

Wie ich verstehe gibt mir mysql entweder dieselbe Datenbank-ID zurück wenn er merkt das es schon eine Verbindung gibt. Wenn ich den vierten Parameter auf true setze dann müsste er mir einen neuen Handle + ID zurückgeben.

Das Problem ist, das es nicht funktioniert. Die dritte Anweisung
gibt mir keinen Handle zum externen Server.

Kann mir jemand helfen bzw. weiss jemand wo der Fehler liegen kann?

Gruss
SmartyShark

  1. Moin!

    Ich habe eine Datenbankklassen mit deren Unterklassen. Jedenfalls
    will ich folgendes machen:

    $db_login = new dbLoginQueries(null,null,null,null);  $db_srvtools = new dbSrvToolsQueries("127.0.0.1",null,null,null);
    $db_iptraff = new
    dbSrvToolsQueries("111.111.122.201","3306","testtable","userid","userpwd");

    Ist schon geklärt, wieso die Objekte mal vier, mal fünf Parameter bekommen? Oder ist das wieder einer deiner Scherze?

    So die ersten zwei handles funktionieren wunderbar, d.h. ich bekomme
    einmal einen handle zurück für die Klasse dbLoginQueries und einmal
    für die Klasse dbSrvToolsQueries, aber beide verweisen auf dieselbe Datenbanke(z.b. test) auf dem Localhost. Der dritte Handle
    soll mir aber eine ID von einer anderen Datenbank auf einem anderen Server geben. Das Problem ist, das wenn die dritte Anweisung ausgeführt wird, ich den localhost handle wieder zurückbekomme.

    Tja, liegt wohl an der internen Funktionsweise der Klasse, deren Quellcode du ja wohlweislich geheim hältst. Vielleicht hilfts, den Code von innen nach hinten zu schleifen...

    - Sven Rautenberg

    --
    "Love your nation - respect the others."
    1. Hi Sven,

      danke erstmal für die Hilfe...

      Ist schon geklärt, wieso die Objekte mal vier, mal fünf Parameter bekommen? Oder ist das wieder einer deiner Scherze?

      Hi Sven, diesmal ist es kein Scherz. Diesmal ist es Todernst!
      Das mit den fünf Parametern, lasse dich davon nicht verwirren.
      Es sind immer fünf. Ich habe nur versehentlich bei den ersten zwei Anweisungen jeweils einen zusätzlichen "null" vergessen.

      Tja, liegt wohl an der internen Funktionsweise der Klasse, deren Quellcode du ja wohlweislich geheim hältst. Vielleicht hilfts, den Code von innen nach hinten zu schleifen...

      Es ist nicht geheim, ich will hier nur niemanden mit zuviel Code verwirren. In der Klasse wir ausser einem Connect und einem db_select
      nichts weiter gemacht. Dann gibt die Klasse ein return des handles zurück. Das wars. Ich habe schon mehrere print_r und echo Ausgaben zur Kontrolle gemacht. Vom Programmaablauf scheint alles zu funktionieren.

      Ich bekomme bei allen drei Anweisungen drei verschiedene Resource-IDs (13 - 15). Alle ids sind unterschiedlich. Das heisst die dritte ID
      hat als Server die 111.111.122.201 etc. Also alles scheint ok zu sein.

      Aber der Schein ist ein Trugschluß! Das ist kein Scherz Sven, ich weiss wirklich nicht was das sein kann.

      Die Fehlermeldung ist:

      Invalid query (Database error): Table 'iptable.kunden' doesn't exist

      Der Fehler ist logisch. Den "iptable" ist die Datenbank von der dritten Anweisung. Kunden ist aber eine Tabelle auf der Datenbank auf dem Localhost. Deswegen findet er zu dem Handle nicht die Tabelle "Kunden". Soweit so gut. Das heisst die dritte Anweisung überschreibt
      die Anweisungen davor. Obwohl ich explizit z.B. das Handle der ersten Anweisung benutze (also localhost), probiert er auf die Datenbank "iptable" der dritten Anweisung zuzugreifen.

      Das einzig logische was mir momentan scheint ist, das sobald man eine Verbindung zu einem externen Datenbankserver macht nachdem man schon eine Verbindung hat und bevor man ein mysql_close macht, die letzte Verbindung als aktuell gesetzt wird.

      Kann das sein? Gibt es da Abhilfe?

      Gruss
      SmartyShark

      1. Moin!

        Tja, liegt wohl an der internen Funktionsweise der Klasse, deren Quellcode du ja wohlweislich geheim hältst. Vielleicht hilfts, den Code von innen nach hinten zu schleifen...

        Es ist nicht geheim, ich will hier nur niemanden mit zuviel Code verwirren. In der Klasse wir ausser einem Connect und einem db_select
        nichts weiter gemacht. Dann gibt die Klasse ein return des handles zurück. Das wars. Ich habe schon mehrere print_r und echo Ausgaben zur Kontrolle gemacht. Vom Programmaablauf scheint alles zu funktionieren.

        Wenn du "kaum Code" hast, warum steht er dann nicht in deinem Posting?

        Ich bekomme bei allen drei Anweisungen drei verschiedene Resource-IDs (13 - 15). Alle ids sind unterschiedlich. Das heisst die dritte ID
        hat als Server die 111.111.122.201 etc.

        Nein, deine Schlußfolgerung ist falsch. Eine von vorherigen IDs unterschiedliche Ressource-ID läßt nicht auf das Ziel der Verbindung schließen.

        Wir brauchen deinen Code. Den vom Connect, und den vom Query.

        - Sven Rautenberg

        --
        "Love your nation - respect the others."
        1. Nein, deine Schlußfolgerung ist falsch. Eine von vorherigen IDs unterschiedliche Ressource-ID läßt nicht auf das Ziel der Verbindung schließen.

          Ich habe bereits den Code umgeschrieben.

          Welche Schlußfolgerung ist falsch? Ich glaube ich liege nicht falsch. Wenn doch dann korrigiere mich bitte sachlich usw. folgendes:

          Wenn du in ein und demselben Skript z.B. zwei verschiedene Datenbank-Verbindungen zu verschiedenen Hosts machst, dann wird die letzte Verbindung aktiv sein.

          Genau das ist bei mir passiert. Ich dachte man kann in einem Skriptdurchlauf meherere Verbindungen zu verschiedenen Servern halten,
          aber das geht nicht, nur wenn das Skript zu Ende gelaufen ist, dann kannst du eine neue Verbindung machen und diese dann im Context benutzen.

          Gruss
          SmartyShark

          1. Moin!

            Nein, deine Schlußfolgerung ist falsch. Eine von vorherigen IDs unterschiedliche Ressource-ID läßt nicht auf das Ziel der Verbindung schließen.

            Ich habe bereits den Code umgeschrieben.

            Funktioniert der jetzt?

            Welche Schlußfolgerung ist falsch? Ich glaube ich liege nicht falsch. Wenn doch dann korrigiere mich bitte sachlich usw. folgendes:

            Wenn du in ein und demselben Skript z.B. zwei verschiedene Datenbank-Verbindungen zu verschiedenen Hosts machst, dann wird die letzte Verbindung aktiv sein.

            Falsch!

            Genau das ist bei mir passiert. Ich dachte man kann in einem Skriptdurchlauf meherere Verbindungen zu verschiedenen Servern halten,

            Das funktioniert.

            aber das geht nicht, nur wenn das Skript zu Ende gelaufen ist, dann kannst du eine neue Verbindung machen und diese dann im Context benutzen.

            Wenn das so ist, dann liegt das an deinem Code - den du verheimlichst, also kann ich dir deinen Fehler nicht zeigen.

            Aber nur mal so als Hinweis zur Funktion mysql_query():

            resource mysql_query ( string $query [, resource $link_identifier] )

            Zum optionalen Parameter $link_identifier steht in der Doku:
            The MySQL connection. If the link identifier is not specified, the last link opened by mysql_connect() is assumed. If no such link is found, it will try to create one as if mysql_connect() was called with no arguments. If by chance no connection is found or established, an E_WARNING level warning is generated.

            Oder aus der deutschen Variante:
            Wird die Verbindungs-Kennung nicht angegeben, wird die zuletzt geöffnete Verbindung angenommen. Wenn keine offene Verbindung besteht, wird versucht eine Verbindung aufzubauen, wie beim Aufruf von mysql_connect() ohne Argumente und diese wird dann benutzt.

            Das entspricht genau deiner Beobachtung - also hast du diesen optionalen Parameter wahrscheinlich nicht benutzt.

            - Sven Rautenberg

            --
            "Love your nation - respect the others."
            1. Hi,

              Funktioniert der jetzt?

              Ja der funktioniert, aber ich würde gerne meine vorherige Variante benutzen.

              Oder aus der deutschen Variante:
              Wird die Verbindungs-Kennung nicht angegeben, wird die zuletzt geöffnete Verbindung angenommen. Wenn keine offene Verbindung besteht, wird versucht eine Verbindung aufzubauen, wie beim Aufruf von mysql_connect() ohne Argumente und diese wird dann benutzt.

              Wieso hast du das nicht gleich gesagt? Ich probiers jetzt. Was ein *******. mysql_query sollte so gehen:

              handle-->mysql_query($query), dann würde es auch kein Problem geben
              oder wie siehst du das?

              Ich schreibe jetzt den Code um.

              Danke Sven,
              Gruss
              SmartyShark

              1. Hallo SmartyShark,

                Wieso hast du das nicht gleich gesagt?

                Weil das im Handbuch steht? Sven geht doch davon aus, dass Du - Du bist ja nun schon etwas länger hier - Dir zumindest inzwischen mal die Handbuchseite angesehen hast.

                Zudem: Sven hat Dir genügend Hinweise in seinen Postings gegeben, dass Du von selbst hättest draufkommen können, wenn Du Dir mal die Zeit genommen hättest, Dich in Ruhe mit seinen Postings auseinanderzusetzen.

                Ich probiers jetzt. Was ein *******. mysql_query sollte so gehen:

                handle-->mysql_query($query), dann würde es auch kein Problem geben
                oder wie siehst du das?

                mysql_query kommt noch aus MySQL-3-Zeiten, als es noch kein OOP gab. Wenn Du Objekte willst, dann nimm die mysqli-Erweiterung.

                Die Frage ist in meinen Augen aber vielmehr: $handle->mysql_query hast Du ja offensichtlich nicht benutzt, weil das sonst einen Parse Error gegeben hätte und nicht einfach einen Logikfehler. Also hast Du wohl nur mysql_query ("..."); genmmen. Mir stellt sich jetzt die Frage, warum Dir DA schon nicht aufgefallen ist, dass es ja für die Funktion mysql_query gar nicht möglich ist zu wissen, welche Verbindung Du meinst, wenn Du sie WEDER als Parameter noch als "Objekt vorher" angibst.

                Viele Grüße,
                Christian

                1. mysql_query kommt noch aus MySQL-3-Zeiten,

                  Äh... PHP-3.

                  1. Hi,

                    ich habe mich mehrmals für die Hilfe bedankt. Und meine Frage, warum
                    er es mir nicht gleich gesagt hat, sollte ein Witz sein.........

                    Kein Sinn für schwarzen Humor? Sven redet ständig um den Brei herum und dann frage ich Ihn -> Warum hast dus mir nicht gleich gesagt:-)

                    Gruss
                    SmartyShark

                    1. Hallo,

                      Und meine Frage, warum er es mir nicht gleich gesagt hat, sollte ein Witz sein.........

                      Kein Sinn für schwarzen Humor?

                      Naja, so wie Du Dich hier im Thread verhalten hast, war das mit dem Witz absolut nicht offensichtlich. Mach in Zukunft bitte einen zwinkernden Smily (";-)") dazu, dann bleiben Missverständnisse auf Grund der mangelnden Gestik/Mimik in schriftlicher Kommunikation aus.

                      Viele Grüße,
                      Christian

                      1. Ihr habt euch nicht besser verhalten.

                        1. Hallo,

                          Ihr habt euch nicht besser verhalten.

                          Hmmm, das "so wie Du Dich verhalten hast" ist wohl deutlich schlechter bei Dir angekommen, als es gemeint war. Sorry.

                          Eigentlich wollte ich damit nur sagen, dass Du in diesem Thread VOR Deinem "Warum hast Du das nicht gleich gesagt?" nicht viel Humor bewiesen hast (eher das Gegenteil [1]) und dass es deswegen ohne Deine Gestik und Mimik zu kennen für Außenstehende nicht möglich war, zu erkennen, dass Du die Frage wirklich humorvoll meinst. Und deswegen wollte ich Dich darauf hinweisen, dass es besser ist, Smileys zu verwenden, um solchen Missverständnissen in Zukunft vorzubeugen. Ich hoffe, ich hab meine Intention jetzt korrekt 'rübergebracht.

                          Viele Grüße,
                          Christian

                          [1] Was jetzt keine Kritik sein soll, es ist jedem sein gutes Recht, genervt zu sein, wenn er mit einem Problem nicht weiterkommt. ;-)

              2. Moin!

                Hi,

                Funktioniert der jetzt?

                Ja der funktioniert, aber ich würde gerne meine vorherige Variante benutzen.

                Oder aus der deutschen Variante:
                Wird die Verbindungs-Kennung nicht angegeben, wird die zuletzt geöffnete Verbindung angenommen. Wenn keine offene Verbindung besteht, wird versucht eine Verbindung aufzubauen, wie beim Aufruf von mysql_connect() ohne Argumente und diese wird dann benutzt.

                Wieso hast du das nicht gleich gesagt?

                Selbst Schuld!

                Ich hab dir seit meinem ersten Posting gesagt, dass du Quellcode posten sollst. Dann hätte ich seit deinem zweiten Posting GEWUSST, das du diesen Fehler machst, und es dir direkt sagen können. Stattdessen hampelst du lieber noch ein paar Runden um den heißen Brei herum.

                Aber jeder so, wie er es mag.

                Mit mysqli in Objektnutzung wäre das übrigens nicht passiert, da ist die DB-Connection durch das benutzte Objekt eindeutig:

                  
                $db1 = new mysqli(server1,user1,passwort1,datenbank1,port1);  
                $db2 = new mysqli(server2,user2,passwort2,datenbank2);  
                  
                $db1->query("SELECT hierwas"); // geht eindeutig an die erste Connection.  
                $db2->query("SELECT dortwas"); // geht eindeutig an die zweite Connection.  
                
                

                - Sven Rautenberg

                --
                "Love your nation - respect the others."
                1. Das war ein Witz. Kühl dich ab.

                  1. Moin!

                    Das war ein Witz. Kühl dich ab.

                    Du verstehst meine Witze offenbar nicht. Kühl DICH mal ab.

                    - Sven Rautenberg

                    --
                    "Love your nation - respect the others."
                    1. KÜHL DICH mal ab.

                    2. Hallo Sven,

                      Das war ein Witz. Kühl dich ab.
                      Du verstehst meine Witze offenbar nicht. Kühl DICH mal ab.

                      Dann gehst Du wohl auch zum Lachen in den Keller, ey?

                      Gruss,
                      MichoDano