PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Mehrere Mysql verbindungen mit Klasse


CrAnE
07.03.2005, 17:44:19
Hi,

Ich versuche mit einer Klasse mehrere MySQL Verbindungen herzustellen...
Das sieht dann ungefähr so aus..
$verbindung1 = new mysql;
$verbindung1->connect("host", "user", "pw", 1);
$verbindung1->db("db", 1);

$verbindung2 = new mysql;
$verbindung2->connect("host"; "user", "pw", 2);
$verbindung2>db("db", 2);

so das klappt auch.. jedoch macht scheint es mir, das er die verbindung einfach ersetzt und nicht eine neue startet....

Also die abfrage bei der ersten verbindung klappt... wenn ich dann jedoch die 2te starte kann ich nix mehr aus der 2ten db auslesen....

hier mal ein codeschnipsel

class mysql{
var $error = false;
var $connection = array();
var $result;
function connect($host, $user, $pass, $id){
$connection = @mysql_connect($host, $user, $pass);
if(!$connection){
$this->error = true;
}else{
$this->connection[$id] = $connection;
}
}
function db($db, $id){
$db = @mysql_select_db($db, $this->connection[$id]);
if(!$db){
$this->error = true;
}
}
}



mfg Crane

|Coding
07.03.2005, 18:14:53
ganz einfach:

falsch:
var $connection = array();
//...
$connection = @mysql_connect($host, $user, $pass);
//...
$this->connection[$id] = $connection;

wenn du so vorgehst, dann passiert folgendes:

$verbindung1->connect(...): $connect wird als string definiert
$verbindung1->db(...): $connect wird als array definiert (array wird überschrieben)

$verbindung2->connect(...): $connect wird als string definiert
$verbindung2->db(...): $connect wird als array definiert (array wird überschrieben)

merkst du was passiert?

du schmeißt so immer wieder dein array ([private] $connect) weg, kein wunder das du immer nur eine connect resource hast...

du musst das array oder den string umbenennen.

CrAnE
07.03.2005, 18:23:23
hm...
wiso wird durch db das array überschrieben??? wie kann ich das problem lösen??? also man könnte theortisch ja statt "var $connection = array();" einfach "var $connection1;" und "var $connection2;" machen aber dann müsste man sich ja auch ne max anzahl von verbindungen machen.... hast du ne idee/tip?

|Coding
07.03.2005, 18:30:15
nein, ich meine das so:

<?php
class mysql{
var $error = false;
var $connection = array();
var $result;
var $con = '';
function connect($host, $user, $pass, $id){
$con = @mysql_connect($host, $user, $pass);
if(!$con){
$this->error = true;
}else{
$this->connection[$id] = $con;
}
}
function db($db, $id){
$db = @mysql_select_db($db, $this->connection[$id]);
if(!$db){
$this->error = true;
}
}
}
?>

CrAnE
07.03.2005, 18:38:18
weiß nicht ob ich jetzt blöd bin aber ich sehe keinen direkten unteschied! das mit "var $con" bring doch meiner meinung nix oder??? du speicherst doch garnix in $con dann müsste da ja $this->con = xxx heißen oder?

|Coding
07.03.2005, 18:42:11
lass das script doch einfach mal laufen...

|Coding
07.03.2005, 18:50:46
äh, sorry. $con ist ja private und nicht public.

also ist es so richtig:

//...
$this->con = @mysql_connect($host, $user, $pass);
if(!$this->con){
$this->error = true;
}else{
$this->connection[$id] = $this->con;
//...

CrAnE
07.03.2005, 18:55:44
Klappt nicht! Was soll ich machen.. ich verzweifle bald!

CrAnE
07.03.2005, 19:30:51
Hm noch wer da??? ich kann ja mal den fehler posten:

Warning: mysql_fetch_assoc(): supplied argument is not a valid MySQL result resource in H:htdocsTestsclasses2.php on line 61

also ich mache 3 abfrage...der genaue ablaus:

ich starte verbindung 1.
mache eine abfrage mit verbindung1.

ich starte verbindung 2
mache eine abfrage mit verbindung 2.

ich mache eine abfrage mit verbindung1.

alle abfragen klappen nur die letzte nicht??? was soll ich machen?

|Coding
07.03.2005, 20:01:29
ok,

weist du was dein problem ist?

1. das mit $this-con wie ich gesagt habe ist richtig.
2. du versuchst die ganze zeit zwei verbindungen zu ein und dem selben server auf zunehmen.
3. du musst der funktion connect() einen rückgabewert verpassen, damit die jeweilige verbingung auch nutzen kann.

4. wenn es probleme gibt poste ich dir die korrekte class.

CrAnE
07.03.2005, 20:25:02
3. du musst der funktion connect() einen rückgabewert verpassen, damit die jeweilige verbingung auch nutzen kann.


wie mache ich das`???
habe keinen blassen schimmer wovon du redest ^^

xabbuh
07.03.2005, 20:37:57
3. du musst der funktion connect() einen rückgabewert verpassen, damit die jeweilige verbingung auch nutzen kann.
Das verstehe ich jetzt wiederum nicht. Wieso soll denn die Verbindungskennung von der Methode zurückgegeben werden, wenn sie schon als Eigenschaft definiert wird und die anderen Methoden somit auf sie zugreifen können?

alle abfragen klappen nur die letzte nicht??? was soll ich machen?
Erstelle dir am besten eine Methode, die dir den exakten Fehler (also den Rückgabewert von mysql_error()) anzeigt.

|Coding
07.03.2005, 20:39:58
Das verstehe ich jetzt wiederum nicht. Wieso soll denn die Verbindungskennung von der Methode zurückgegeben werden, wenn sie schon als Eigenschaft definiert wird und die anderen Methoden somit auf sie zugreifen können?
weit du sonst ein query immer an die letzte verbindungskennung schickst.

xabbuh
07.03.2005, 20:44:07
<?php
function Query($sql, $id)
{
$this->result = mysql_query($sql, $this->connection[$id]);
}
?>


Wieso sollte man dafür einen Rückgabewert der Methode zum Verbinden benötigen? Oder verstehe ich irgendwas jetzt ganz falsch?

|Coding
07.03.2005, 20:47:52
das ist ja auch nur dann nötig, wenn er keine methode für query hat. wenn du das query ausserhalb der class ausführen willst musst du eine verbindungskennung zu unterscheidung haben.

mit einer methode für query wäre das natürlich überflüssig, die hat er aber nicht ;-) (der zumindest nicht gepostet)

xabbuh
07.03.2005, 20:53:11
mit einer methode für query wäre das natürlich überflüssig, die hat er aber nicht ;-) (der zumindest nicht gepostet)
Okay, jetzt verstehe ich deinen Gedankengang. :-) Auf so eine Idee war ich allerdings gar nicht gekommen, da eine Datenbankklasse nicht wirklich viel Sinn macht, wenn man keine Methode für Datenbankabfragen hat und ich glaube auch nicht, dass es bei ihm so ist. :-)
Der Fehler wird wohl wirklich eher in der Abfrage zu suchen sein.

CrAnE
07.03.2005, 21:08:04
Ich habe eine extra methode für die abfrage! Bei der abfrage:

$verbindung->select("query", $id);

jedoch ist das problem weiterhin... die methode ist fast so aufgebaut wie die die du eben gepostet hast

|Coding
07.03.2005, 21:11:12
bei mir klappt es wunderbar, du darfst nur nicht auch den gleichen host mehr mals zugreifen. das geht schief.

mit zwei verschiedenen hosts klapp es bei mir gut.

CrAnE
07.03.2005, 21:13:02
hm, ok dann muss ich mir was anderes überlegen..

xabbuh
07.03.2005, 21:14:19
Hast du mal mit mysql_error() gearbeitet? Wie sah die Fehlermeldung aus?

CrAnE
07.03.2005, 21:19:04
ich versuche auf mehrere datenbanken gleichzeitig zuzugreifen auf dem selben host.. draan liegt warscheinlich das problem

xabbuh
07.03.2005, 21:21:08
ich versuche auf mehrere datenbanken gleichzeitig zuzugreifen auf dem selben host.. draan liegt warscheinlich das problem
Das beantwortet meine Frage aber immer noch nicht... :-)

|Coding
07.03.2005, 21:22:44
warum? wenn du ein und den selben server ansprechen willst musst du deine objects halt klonen...

$verbindung1 = new mysql;
$verbindung1->connect("host", "user", "pw", 1);

$verbindung2 = $verbindung1;
$verbindung2->db("db1", 1);

$verbindung3 = $verbindung1;
$verbindung3->db("db2", 1);

nur wenn du verschiedene server ansprechen willst musst du eine neue instanz bilden.

CrAnE
07.03.2005, 21:33:56
Klappt nicht! der kann immer nur auf die neuste db konnecten

CrAnE
07.03.2005, 21:35:44
Bzw. auf meinem server gehts mit 2 verschieden hosts... habe bei meinem provider für jede db einen eigenen benutzernamen^^ da geht das localhost aber bei beiden nur root

xabbuh
07.03.2005, 21:44:28
Warum antwortest du nicht mal auf meine Frage?

CrAnE
07.03.2005, 22:08:43
hm weil es jetzt übeflüssig ist weil ich ja den fehler gefunden habe oder?? ^^ warum dann nochmal aufwand machn :D bin auch müde und habe keinen bock mehr auf coden :D

|Coding
07.03.2005, 23:18:03
ok, ich sehs gerade, deine klasse ist noch nicht bereit, objekte zu klonen.

AA
08.03.2005, 02:04:56
für das problem gibt es mehrere lösungen. zunächst, warum es keinen sinn macht, objekte zu klonen oder sonstigen unfug zu betreiben:

wird die funktion mysql_connect() mehrfach mit identischen parametern aufgerufen, wird nicht wirklich eine neue verbindung erstellt, sondern eine eventuell bestehende verbindung benutzt, die mit identischen parametern geöffnet wurde. damit werden eventuelle resultsets aus vorhergehenden anfragen wieder gelöscht, bzw. überschrieben.

erst seit php 4.2 gibt es die möglichkeit, mittels flag in der funktion mysql_connect() mehrfachverbindungen auch mit identischen parametern zu erzwingen.

1. lösung:
erstelle unterschiedliche datenbank-benutzer und gebe ihnen die rechte für die betreffenden datenbanken und du wirst sehen, dass du mit 2 objekten aus der gleichen klasse auch wirklich 2 unterschiedliche verbindungen aufmachen und erhalten kannst.

2. lösung:
benutze nach abfrage der php-version den zusätzlichen "mehrverbindungs"-parameter. dies macht jedoch eine änderung deiner klasse notwendig.

3. lösung:
vorausgesetzt, du benutzt einen identischen benutzer für beide datenbanken und du möchtest deine klasse nicht ändern, dann sprich die tabellen mittels des datenbanknamens an: statt table also ein database.table.

|Coding
08.03.2005, 02:08:33
was ist denn deiner meinung falsch am klonen?

AA
08.03.2005, 02:14:42
"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."

www.php.net/mysql_connect

du änderst an dieser gesetzmäßigkeit durch wie auch immer geartetes objekt-handling nichts. die musik spielt bei der funktion mysql_connect(). wie oben bereits geschrieben, sind meine 3 (praxisgetesteten) lösungen zu bevorzugen.

|Coding
08.03.2005, 02:21:09
wie sagt man doch so schön: "viele wege führen nach rom" :-)