ERLEDIGT
NEIN
NEIN
ANTWORTEN
10
10
ZUGRIFFE
490
490
EMPFEHLEN
-
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:
============================
Die Objektinstanzierung: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
}
============================
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;
}
...
-
PHP-Code:
$this->CONN = $conn; // ******! HIER SCHEINT DAS PROBLEM ZU LIEGEN
return $conn;
} // function init
...
-
23.08.02 02:07 #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
}
Das Fehler-Handling solltest du total in die Klasse implementieren.PHP-Code:$db = new clsMySQL("user", "pass", "server", "dbname");
Geändert von Patrick Kamin (23.08.02 um 02:26 Uhr)
--
GNU/Linux - Weil man echte Freunde nicht kaufen kann
-
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)
-
23.08.02 02:29 #5
- Registriert seit
- Apr 2001
- Ort
- Hamburg
- Beiträge
- 1.309
Welche Abfragen meinst du?
--
GNU/Linux - Weil man echte Freunde nicht kaufen kann
-
PHP-Code:
mysql_query('...', $verbindungshandle )
-
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
-
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
„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
-
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.
-
================= 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):
nachher:PHP-Code:$conn = mysql_connect($server, $user, $pass)
Danke nochmal für Eure Bemühungen!PHP-Code:$conn = mysql_connect($server, $user, $pass, TRUE)
Ähnliche Themen
-
Problem mit Darstellung über mehrere Bilder
Von himmelvergebenusw im Forum HTML & XHTMLAntworten: 2Letzter Beitrag: 21.03.08, 12:52 -
Datenbank Klasse für verschiedene Datenbanken
Von Schlickser im Forum PHPAntworten: 1Letzter Beitrag: 23.07.07, 10:33 -
SQL View über mehrere Datenbanken
Von michaelapp im Forum Relationale DatenbanksystemeAntworten: 4Letzter Beitrag: 13.10.05, 15:23 -
Group By Problem über mehrere Tabellen
Von mail2mrx im Forum Relationale DatenbanksystemeAntworten: 13Letzter Beitrag: 18.06.04, 14:44 -
Problem bei abfrage über 2 datenbanken ....hilfee dunsti ^^
Von HammerHe@rt im Forum Relationale DatenbanksystemeAntworten: 2Letzter Beitrag: 29.11.01, 17:18





Zitieren

Login






[PHP][Snippet] Array zu XML konvertieren