"PHP has encountered a Stack overflow" bei mehreren MySQL Verbindungen?!

chris4712

Erfahrenes Mitglied
Hallo!

ich versuche mich grade daran auf verschiedene MySQL Server, in einem Script zuzugreifen.

Dieser Teil wird in jeder PHP Datei am Anfang ausgeführt:
PHP:
$OWNDB = mysql_connect($OwnDBhost, $OwnDBuser, $OwnDBpass);
mysql_select_db($OwnDBname, $OWNDB);

Nun wollte ich auf die Datenbank des zweiten Servers zugreifen. Die Zugangsdaten hierzu stehen in der Datenbank des ersten Servers:
PHP:
  function connect_user_db()
  {
    GLOBAL $DomainDB, $OWNDB;
        
    $Querry = mysql_fetch_assoc(mysql_query("SELECT db_host, db_name, db_user, db_password FROM $DomainDB AS DOMAIN WHERE DOMAIN.ID = '".$_SESSION["USER_DOMAIN_ID"]."'", $OWNDB));
         
    // Verbindung herstellen
	  $USERDB = mysql_connect($Querry["db_host"], $Querry["db_user"], $Querry["db_password"]);
	  mysql_select_db($Querry["db_name"], $USERDB);
   
    return $USERDB;
  }

OK soweit. Bis hierhin klappt es.
Nun möchte ich aber nochmals auf Datenbank 1 zugreifen:
PHP:
  function get_user_db_name($requiredDB)
  {
    GLOBAL $DomainDB, $OWNDB;

    $UserDB = mysql_fetch_assoc(mysql_query("SELECT ".$requiredDB." FROM $DomainDB AS DOMAIN WHERE DOMAIN.ID = '".$_SESSION["USER_DOMAIN_ID"]."'", $OWNDB));
    
    return $UserDB["db_content"];
  }
In der Funktion wollte ich dann den jeweiligen Tabellennamen auslesen den ich brauche.

Danach kommt aber dann der "PHP has encountered a Stack overflow".

Es liegt irgendwie daran das die Verbindung zur anderen Datenbank schon besteht.


Muss dazusagen das es im Moment alles noch auf ein und dem selben MySQL Server gespeichert ist und nur unterschiedliche Datenbanken sind.

Gruß
 
Auf welcher Zeile bekommst du den Fehler?

Du solltest nicht verschieden Sachen gleich benamsen, auch wenn sie in verschidenen Funktionen sind.
einma ist userdb eune DB-Verbindung, dann ist userdb ein String.

Die letzte Funktion (get_user_db_name) geht nur, wenn $requiredDB == "db_content" ist. Ansonsten hast du dort kein Wert in $UserDB["db_content"] den du zurückgeben kannst, da du das Feld db_content nicht im SELECT-Teil der Abfrage hast.
 
Hallo Yaslaw!

Auf welcher Zeile bekommst du den Fehler?
Grade am Anfang. Ohne Angabe einer Zeilennummer.

Du solltest nicht verschieden Sachen gleich benamsen, auch wenn sie in verschidenen Funktionen sind.
einma ist userdb eune DB-Verbindung, dann ist userdb ein String.
Stimmt, habe ich grade gesehen. OK, denke mir einen anderen Namen aus :)

Die letzte Funktion (get_user_db_name) geht nur, wenn $requiredDB == "db_content" ist. Ansonsten hast du dort kein Wert in $UserDB["db_content"] den du zurückgeben kannst, da du das Feld db_content nicht im SELECT-Teil der Abfrage hast.
Ja, ist mir mittlerweile auch aufgefallen. Hatte da noch vom Testen einen falschen Wert drin stehen.

Kleiner Nachtrag:
Ich habe das Script nun auch mal auf einem 1&1 Server laufen. Da funktioniert es wunderbar!
Kann es vielleicht daran liegen das ich zu ein und dem selben MySQL Server zwei Verbindungen aufbaue? Also zumindest in meiner Testumgebung. Auf 1&1 sind es wirklich zwei verschiedene Datenbanken und auch DB Server.
 
Hat sich erledigt!

Das Problem lag wirklich daran das ich mit den gleichen Zugangsdaten eine neue Verbindung aufbauen wollte.
Habe nochmals das Manuel von mysql_connect durchforstet:
Für den Fall, dass ein zweiter Aufruf von mysql_connect() mit den gleichen Argumenten erfolgt, wird keine neue Verbindung aufgebaut, sondern die Verbindungs-Kennung der schon bestehenden Verbindung zurückgeliefert.

Lösung:
Der Parameter neue_Verbindung beeinflusst dieses Verhalten und mysql_connect() öffnet immer eine neue Verbindung, sogar dann, wenn mysql_connect() zu einem früheren Zeitpunkt mit den gleichen Parametern aufgerufen wurde.

PHP:
mysql_connect ([ string $Server [, string $Benutzername [, string $Benutzerkennwort [, bool $neue_Verbindung [, int $client_flags ]]]]] )

In meinem Fall bedeutet dies:
PHP:
$USERDB = mysql_connect($Querry["db_host"], $Querry["db_user"], $Querry["db_password"], true);

Grüße!
 
Zurück