tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
10
ZUGRIFFE
490
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    patrique patrique ist offline Mitglied Bronze
    Registriert seit
    Aug 2002
    Beiträge
    40
    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-Code:
    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-Code:
    ... 
    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; 

    ... 
     

  2. #2
    Scope Scope ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Paderborn (NRW)
    Beiträge
    167
    PHP-Code:
    $this->CONN $conn// ******! HIER SCHEINT DAS PROBLEM ZU LIEGEN 
    return $conn
    // function init 

    ... 
     

  3. #3
    Registriert seit
    Apr 2001
    Ort
    Hamburg
    Beiträge
    1.309
    Ich würde ein paar Änderungen an der Klasse vornehmen. Hier einfach mal mein Vorschlag.
    PHP-Code:
    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-Code:
    $db = new clsMySQL("user""pass""server""dbname"); 
    Das Fehler-Handling solltest du total in die Klasse implementieren.
    Geändert von Patrick Kamin (23.08.02 um 02:26 Uhr)
     
    --
    GNU/Linux - Weil man echte Freunde nicht kaufen kann

  4. #4
    Scope Scope ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Paderborn (NRW)
    Beiträge
    167
    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)
     

  5. #5
    Registriert seit
    Apr 2001
    Ort
    Hamburg
    Beiträge
    1.309
    Welche Abfragen meinst du?
     
    --
    GNU/Linux - Weil man echte Freunde nicht kaufen kann

  6. #6
    Scope Scope ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Paderborn (NRW)
    Beiträge
    167
    PHP-Code:
    mysql_query('...'$verbindungshandle 
     

  7. #7
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    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.
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  8. #8
    Scope Scope ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Paderborn (NRW)
    Beiträge
    167
    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.
     

  9. #9
    Registriert seit
    Dec 2001
    Ort
    Bayern
    Beiträge
    5.806
    Blog-Einträge
    5
    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
     
    „Gib einem Menschen einen Fisch, und er wird für einen Tag satt. Lehre ihn Fischen, und er wird ein Leben lang satt.“
    “For every complex problem, there is an answer that is short, simple and wrong.”
    “Pessimism is safe, but optimism is a lot faster!”


    Aktuelles Coding Quiz: #17 - Wörter kreuz und quer

  10. #10
    Scope Scope ist offline Mitglied Gold
    Registriert seit
    Dec 2001
    Ort
    Paderborn (NRW)
    Beiträge
    167
    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.
     

  11. #11
    patrique patrique ist offline Mitglied Bronze
    Registriert seit
    Aug 2002
    Beiträge
    40
    ================= LÖSUNG =====================

    Hi Leute,

    danke für Eure Mühen, aber ich habe inzwischen eine Lösung gefunden. Jemand im selfphp.net-Forum hatte den rettenden Ratschlag: Ab php 4.2 könn der Funktion mysql_connect zwei weitere Parameter übergeben werden, wovon der erste ein bool'scher Wert ist, der wenn er auf TRUE steht nichts anderes macht, als php zu zwingen eine neue Connection aufzubauen und nicht etwa eine bereits bestehende Connection zu verwenden, die mit den gleichen Parametern aufgerufen wurde.

    So siehst das aus:
    voher (zur Erinnerung):
    PHP-Code:
    $conn mysql_connect($server$user$pass
    nachher:
    PHP-Code:
    $conn mysql_connect($server$user$passTRUE
    Danke nochmal für Eure Bemühungen!
     

Ähnliche Themen

  1. Problem mit Darstellung über mehrere Bilder
    Von himmelvergebenusw im Forum HTML & XHTML
    Antworten: 2
    Letzter Beitrag: 21.03.08, 12:52
  2. Antworten: 1
    Letzter Beitrag: 23.07.07, 10:33
  3. SQL View über mehrere Datenbanken
    Von michaelapp im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 13.10.05, 15:23
  4. Group By Problem über mehrere Tabellen
    Von mail2mrx im Forum Relationale Datenbanksysteme
    Antworten: 13
    Letzter Beitrag: 18.06.04, 14:44
  5. Problem bei abfrage über 2 datenbanken ....hilfee dunsti ^^
    Von HammerHe@rt im Forum Relationale Datenbanksysteme
    Antworten: 2
    Letzter Beitrag: 29.11.01, 17:18