Problem: Mehrere Datenbanken über Klasse

patrique

Mitglied
Hi!

Ich habe es mir einfach gemacht und eine mySQL-Klasse aufgebaut, über die ich bisher alle DB-Funktionen laufen ließ. Leider ist eine neue Anforderung, daß in einem Projekt zwei Datenbanken gleichzeitig abgefragt werden müssen ... Theoretisch ist meine Klasse so allgemein aufgebaut, daß ich einfach zwei Objektinstanzen bilden kann und beide mit unterschiedlichen DB-Infos (User, Pass, Server, DBName) versorgen kann, doch eigenartiger Weise führt das initialisieren des zweiten DB-Objektes dazu, daß die Connection des ersten mit der des zweiten überschrieben wird. Scheinbar greifen die Instanzen über $this nicht auf ihre eigenen Variablen, sondern auf die der Mutterklasse zu, ansonsten kann ich mir nicht erklären, warum die Variable $CONN der ersten DB nach der Initialisierung der zweiten DB deren $CONN enthält.

Irgendwelche Ideen?
Gruß Patrique



Die Klasse clsMySQL in mysql.php:
============================
PHP:
Class clsMySQL 
{ 
var $USER; // Benutzer-Login 
var $PASS; // Passwort 
var $SERVER; // Server-Name 
var $DBNAME; // Datenbank-Name 
var $CONN; // Connection 

function init ($user, $pass, $server, $dbname) 
{ 
$this->USER = $user; 
$this->PASS = $pass; 
$this->SERVER = $server; 
$this->DBNAME = $dbname; 

$conn = mysql_connect($server, $user, $pass); 
if(!$conn) 
{ 
echo "Connection konnte nicht aufgebaut werden<BR>\n"; 
} 
if(!mysql_select_db($dbname, $conn)) 
{ 
echo "DBSelect konnte nicht ausgeführt werden<BR>\n"; 
} 
$this->CONN = $conn; // !!!! HIER SCHEINT DAS PROBLEM ZU LIEGEN 
return true; 
} // function init 

... Hier folgen alle Methoden der Klasse, die ich aus Platzgründen hier auslasse 
}
Die Objektinstanzierung:
============================
PHP:
... 
include("mysql.php"); 

// MySQL-Instanzen ableiten 
$db1 = new clsMySQL; 
$db2 = new clsMySQL; 

// MySQL-Instanzen initialisieren 
if (!$db1->init($DB1_USER, $DB1_PASS, $DB1_SERVER, $DB1_DBNAME)) 
{ 
echo "Datenbank (db1) konnte nicht geöffnet werden<BR>\n"; 
exit; 
} 

if (!$db2->init($DB2_USER, $DB2_PASS, $DB2_SERVER, $DB2_DBNAME)) 
{ 
echo "Datenbank (db2) konnte nicht geöffnet werden<BR>\n"; 
exit; 
} 
...
 
PHP:
$this->CONN = $conn; // !!!! HIER SCHEINT DAS PROBLEM ZU LIEGEN 
return $conn; 
} // function init 

...
 
-

Ich würde ein paar Änderungen an der Klasse vornehmen. Hier einfach mal mein Vorschlag.
PHP:
class clsMySQL
{
var $USER; // Benutzer-Login
var $PASS; // Passwort
var $SERVER; // Server-Name
var $DBNAME; // Datenbank-Name
var $CONN; // Connection

function clsMySQL ($user, $pass, $server, $dbname)
{
    $this->USER = $user;
    $this->PASS = $pass;
    $this->SERVER = $server;
    $this->DBNAME = $dbname;
    $this->connect();
}
function connect()
{
    $this->CONN = mysql_connect($this->SERVER, $this->USER, $this->PASS);
    if(!$this->CONN)
    {
     die("Connection konnte nicht aufgebaut werden: ".mysql_error());
    }

     if(!mysql_select_db($$this->DBNAME, $this->CONN))
     {
      echo "DBSelect konnte nicht ausgeführt werden".mysql_error()."<BR>\n";
     }
}
... Hier folgen alle Methoden der Klasse, die ich aus Platzgründen hier auslasse
}
PHP:
$db = new clsMySQL("user", "pass", "server", "dbname");
Das Fehler-Handling solltest du total in die Klasse implementieren.
 
Zuletzt bearbeitet:
Ist denn das die Lösung, Caminus?

Ich denke, das Problem liegt in der fehlende Übergabe eines Verbindungs-Handles, den man in die Abfragen einbauen muss.
(wie geschrieben)
 
Mich würde mal interessieren, was bei dir nach den Aufrufen von $db1->init und $db2->init jeweils in deren Membervariable CONN steht. Wenn die Stringdarstellung von beiden "Resource id #1" sein sollte, würde mich das sehr überraschen. Ich hab nämlich deine Klasse getestet, und bei mir funktioniert sie einwandfrei. Auch mit drei oder vier Servern.

Mein Verdacht (und die für mich einzig logische Erklärung) ist, dass du bei deinen Aufrufen von mysql_query und den anderen der Initialisierung folgenden mysql-Befehlen die falsche Connection ID übergibst. Evtl. solltest du mal checken, ob da auch überall tatsächlich $this->CONN als letzter Parameter steht.


HTH

reima


edit: Ups... hatte ganz überlesen, dass Scope das mit der Connection ID schon angesprochen hatte.
 
Meinch ja.
Bei beiden Initialisierungen die zurückgegebene Connection-ID in eine Variable speichern und bei allen queries angeben, je nach dem welche Verbindung du ansprechen willst.
 
Die Connection ID wird ja per $this->CONN = $conn; in die Membervariable der Klasse übertragen. Also braucht man da gar nichts zurückgeben und in eine globale Variable speichern. Und eine Memberfunktion query schnappt sich die dann wieder aus der eigenen Klasse.

Sorry, falls ich deine Antwort falsch interpretiert haben sollte und du genau das gemeint hast... aber es ist schon spät, die Konzentration lässt nach ;)
 
Nene, würd sagen, dass es meine Konzentration war.
Hab nur die Klassen-Variable übergeben, und da ich es bei mir immer ohne Klasse mit einer globalen Verbindungs-Variable mache, war ich ein wenig verwirrt.
Klar, man kann dann natürlich auch die Klassen-Variable an die Queries übergeben.
 

Neue Beiträge

Zurück