Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 21.08.2006 18:39:01 von Frida Mertens

Guten Tag,

aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
Für den Server benötige ich für jede DB einen anderen
Namen/Passwort (bei all-inkl).

ich habs jetzt so:

$Verbindungskennung_db1 = mysql_connect($db_server,$user1,$passw1);
$Verbindungskennung_db2 = mysql_connect($db_server,$user2,$passw2);
mysql_select_db($db1,$Verbindungskennung_db1);
mysql_select_db($db2,$Verbindungskennung_db2);
$query = ... aus Tabellen in DB1 und Tabellen in DB2 ...
$result = @mysql_query($query,$Verbindungskennung_db1);
if (!$result) mysql_error();

hier gibts kein Result aber auch keinen error.

muß ich mysql_select_db auseinanderhalten?

ich komme da momenztan nicht drauf ...

Danke für Hilfen,
viele Grüße, Frida

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 21.08.2006 18:51:49 von ascii158

Frida Mertens schrieb:
> Guten Tag,

Moin,

> aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
> Für den Server benötige ich für jede DB einen anderen
> Namen/Passwort (bei all-inkl).

Das dürfte nur in einer Anwendung gehen. Wie sollten die Datenbanken
sich, zum Beispiel für einen Join, auch austauschen?

> ich habs jetzt so:
>
> $Verbindungskennung_db1 = mysql_connect($db_server,$user1,$passw1);
> $Verbindungskennung_db2 = mysql_connect($db_server,$user2,$passw2);
> mysql_select_db($db1,$Verbindungskennung_db1);
> mysql_select_db($db2,$Verbindungskennung_db2);
> $query = ... aus Tabellen in DB1 und Tabellen in DB2 ...
> $result = @mysql_query($query,$Verbindungskennung_db1);
> if (!$result) mysql_error();
>
> hier gibts kein Result aber auch keinen error.

Natürlich nicht. Du fragst die Datenbank 1 aber nie die Datenbank 2. Da
es keinen Fehler gibt, scheint es in beiden Datenbanken gleiche Tabellen
zu geben -- und der Join (?) ist halt auf einer einzelnen Datenbank
leer.

> muß ich mysql_select_db auseinanderhalten?

Was meinst du damit?

Grüße,
--
Philipp Tölke
PGP: 0x96A1FE7A

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 21.08.2006 18:52:23 von Sven Paulus

Frida Mertens wrote:
> aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
> Für den Server benötige ich für jede DB einen anderen
> Namen/Passwort (bei all-inkl).

Das geht nicht. Du kannst nur dann einen Query machen, der auf
mehrere Datenbanken zugreift, wenn Du innerhalb von einer Connection
die Permissions fuer den Zugriff auf _alle_ Datenbanken hast.

Dann geht sowas wie

SELECT x.id, y.value FROM db1.table_a x, db2.table_b y WHERE x.id =3D y.id

MySQL sieht ja gar nicht, dass diese Verbindungen, die Du sequentiell
aufbaust, irgendwie zusammengehoeren, kann also nicht die Rechte
"zusammenaddieren" (sowas wuenschst Du Dir ja). Es gibt auch keinen
Call, mit dem man erst eine Connection mit bestimmten Rechten
aufbauen und dann weitere Rechte dieser Connection hinzufuegt.

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 21.08.2006 18:59:43 von ascii158

Philipp Tölke schrieb:
>> aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
>> Für den Server benötige ich für jede DB einen anderen
>> Namen/Passwort (bei all-inkl).
>
> Das dürfte nur in einer Anwendung gehen. Wie sollten die Datenbanken
> sich, zum Beispiel für einen Join, auch austauschen?

Das ist natürlich Unsinn. Ich hatte Anfangs verstanden, dass du dich zu
verschiedenen Servern verbinden willst. Dann würde der Satz oben gelten,
wenn man "Datenbank" durch "DBMS" ersetzt.

Grüße,
--
Philipp Tölke
PGP: 0x96A1FE7A

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 21.08.2006 20:11:37 von Weinzierl Stefan

Frida Mertens wrote:
> Guten Tag,
>
> aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
> Für den Server benötige ich für jede DB einen anderen
> Namen/Passwort (bei all-inkl).

Wäre eine Federated-Tabelle eine Möglichkeit?

Stefan

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 21.08.2006 20:27:22 von Thomas Rachel

Frida Mertens wrote:

> aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
> Für den Server benötige ich für jede DB einen anderen
> Namen/Passwort (bei all-inkl).

Wenn es wirklich so ist, daß Du mit der einen Kombination nur auf eine
Datenbank zugreifen kannst und mit der anderen Kombination auf eine
andere (auch wenn die DB auf demselben Server liegen), dann kann Dir
MySQL nicht helfen. Dann mußt Du die Connections strikt trennen.


> $Verbindungskennung_db1 = mysql_connect($db_server,$user1,$passw1);
> $Verbindungskennung_db2 = mysql_connect($db_server,$user2,$passw2);
> mysql_select_db($db1,$Verbindungskennung_db1);
> mysql_select_db($db2,$Verbindungskennung_db2);

Soweit ok.

> $query = ... aus Tabellen in DB1 und Tabellen in DB2 ...

Und das geht eben nicht. Der Server könnte zwar vielleicht wissen, daß
die Anfrage vom selben Rechner kommt, aber er weiß nicht, daß es
dieselbe Anwendung ist und er weiß auch nicht, daß die Befugnisse in
Ordnung sind.

Deshalb müßtest Du 2 Queries absetzen, z.B. mit

> $result1 = @mysql_query($query1,$Verbindungskennung_db1);
> if (!$result1) mysql_error($Verbindungskennung_db1);
> $result2 = @mysql_query($query2,$Verbindungskennung_db2);
> if (!$result2) mysql_error($Verbindungskennung_db2);


> hier gibts kein Result aber auch keinen error.

Daß Du keinen Error erhieltest, ist eine Eigenart von PHP (ist übrigens
in einer anderen NG ontopic): wenn Du bei einer MySQL-Funktion den
Verbindungshandle wegläßt, setzt er dafür den zuletzt erstellten ein. In
Deinem Fall hast Du aber auf Verbindung 1 eine Anfrage gestartet, die
(vermutlich aufgrund fehlender Rechte) fehlschlug, Du fragtest aber
(implizit) nach der Fehlermeldung auf Verbindung 2. Und da gab es eben
keine...


> muß ich mysql_select_db auseinanderhalten?

Ja, und alles andere auch.


Thomas
--
Wer lächelt, wenn etwas schiefgeht, weiss einen, den er dafür
verantwortlich machen kann.

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 22.08.2006 12:13:51 von Frida Mertens

Vielen Dank für die Hinweise!

> ...
Federated-Tabelle hört sich sehr interessant an,
das kannte ich noch nicht.
Ich habe aber noch nicht herausbekommen, wie ich feststellen kann,
obs es unter meinen Bedingungen (3.23 bei mir und dem Hoster) läuft.
Auf der "Konsole"(DOS) configure ... eingegeben und
have_federated_engine ergab nichts und beim hoster steht
in der phpinfo-Seite nichts davon.

> ...
> Dann mußt Du die Connections strikt trennen.

.... also würde das "normalerweise" mit einer TEMP-Tabelle gehen?
Die aus 2 Selects füllen ...

viele Grüße, Frida

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 22.08.2006 12:26:48 von Christian Kirsch

Frida Mertens schrieb:
> Vielen Dank für die Hinweise!
>
> > ...
> Federated-Tabelle hört sich sehr interessant an,
> das kannte ich noch nicht.
> Ich habe aber noch nicht herausbekommen, wie ich feststellen kann,
> obs es unter meinen Bedingungen (3.23 bei mir und dem Hoster) läuft.

Handbuch? Federated Tabellen gibt's erst ab 5.x, IIRC.

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 22.08.2006 14:46:46 von Thomas Rachel

Frida Mertens wrote:

> ... und beim hoster steht in der phpinfo-Seite nichts davon.

Dort wird davon auch nix stehen, das ist ein Feature von MySQL, nicht von
PHP.

> > Dann mußt Du die Connections strikt trennen.
>
> ... also würde das "normalerweise" mit einer TEMP-Tabelle gehen?
> Die aus 2 Selects füllen ...

Nein. TEMP-Tabellen funktionieren auch mit Connections.

Du bist sicher, daß keine der beiden Connections Zugriff auf die jeweils
andere Tabelle hat? Das wäre nämlich das einfachste...


Thomas
--
Und wir singen: Bye bye Miss American Pie / Ich hab's länger schon
befürchtet, und jetzt ist es soweit / Madonna quietscht, und das Publikum
schreit: / 'This will be the day that I die.'
(http://www.schlabonski.de/americanpie.html)

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 23.08.2006 00:57:54 von Dominik Echterbruch

Frida Mertens wrote:
>
> aus 2 Datenbank wollte ich ein Ergebnis zusammensetzen.
> Für den Server benötige ich für jede DB einen anderen
> Namen/Passwort (bei all-inkl).

IMHO einfachste Lösung (sofern es nicht gleich benamte Tabellen gibt
oder Größenbeschränkungen dagegen sprechen, etc.):
- eine der DBen dumpen
- Dump in die andere DB einspielen
- in der Anwendung die neuen Connection Daten hinterlegen
- Join über die jetzt in der selben DB liegenden Tabellen machen

Wenn in einer der Anwendungen ein Tabellenprefix konfigurierbar ist,
kannst du den benutzen, um die Tabellen zu trennen. Allerdings würdest
du dann mit einem einfachen Suchen & Ersetzen im Dump die Prefixes
hinzufügen müssen, bevor du ihn wieder einspielst.


Grüße,
Dominik
--
Norbert Melzer in d.c.d.mysql:
F: Wie verstehe ich diese FAQ am besten?
A: Studieren Sie Datanbank-Design und lesen Sie anschliessend alles nochmal

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 23.08.2006 17:43:23 von Frida Mertens

Hallo Leute,
> ...
> Du bist sicher, daß keine der beiden Connections Zugriff auf die jeweils
> andere Tabelle hat? Das wäre nämlich das einfachste...
hat bisher nicht geklappt:
Access denied for user: 'xy@%' to database 'ccc'
"... jede Datenbank verfügt über eigene Zugangsdaten (Nutzername und
Passwort) und Sie müssen sich in jede extra einloggen."
Weiß nicht, wo da eine Lücke sein könnte, um von einer anderen
"so" was runterzuziehen.

Am vernünftigsten hört sich ja eine Federated-Tabelle an
(keine doppelten Daten), geht ja aber nicht.
Ein Korrektur noch:
all-inkl.com hat nicht mehr mysql 3.23 sondern 4.0.23-Max-Long
am laufen.
Ab Vers. 5.0 müßte ja dann die Federated-Tabelle auch in den
Variablen stehen.?

Sonst bin ich noch nicht weiter ...
Ich probiers dann mal mit dem Dumpen ...

Vielen Dank!
Grüße, Frida

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 23.08.2006 17:59:10 von Thomas Rachel

Frida Mertens wrote:

> Hallo Leute,
> > ...
> > Du bist sicher, daß keine der beiden Connections Zugriff auf die
> > jeweils andere Tabelle hat? Das wäre nämlich das einfachste...

Warum zitierst Du mich, antwortest aber auf Dominik?


> hat bisher nicht geklappt:
> Access denied for user: 'xy@%' to database 'ccc'
> "... jede Datenbank verfügt über eigene Zugangsdaten (Nutzername und
> Passwort) und Sie müssen sich in jede extra einloggen."

Gut, wenn es so ist, kann man da wohl nix ändern.

Dann gibts aber auch keine MySQL-seitige Verbindungsmöglichkeit, d.h. Du
mußt das "Joinen" anwendungsseitig machen oder aber die Daten, die
mengenmäßig am wenigsten sind, in der anderen DB in eine Temporary Table
eingeben und den Join dann dort durchführen lassen. (Oder in eine
permanente Tabelle, und den Datenbestand je nach Bedarf updaten.)

Wäre es denn denkbar, die beiden Tabellen dauerhaft in derselben Datenbank
zu belassen?

> Am vernünftigsten hört sich ja eine Federated-Tabelle an
> (keine doppelten Daten), geht ja aber nicht.

> Ein Korrektur noch:
> all-inkl.com hat nicht mehr mysql 3.23 sondern 4.0.23-Max-Long
> am laufen.
> Ab Vers. 5.0 müßte ja dann die Federated-Tabelle auch in den
> Variablen stehen.?

Kenne mich da nicht aus, deshalb die Frage: Geht denn "Federated" in diesem
Fall, wo keiner der beiden Accounts Zugriffsberechtigung auf die jeweils
andere DB hat?


Thomas
--
Hier hätte ich ja gerne eine Signatur hingesetzt. Aber erstens ist mir kein
sinnvoller Inhalt eingefallen, für den es sich gelohnt hätte, einen eigenen
Eintrag in die Signaturdatei aufzunehmen, und zum anderen sind Signaturen ja
auch meistens völlig überflüssig und nehmen nur unnötig Platz weg.

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 24.08.2006 15:38:06 von Frida Mertens

Tag nochmal,
ich bin leider noch nicht weiter gekommen.

------

ein Temp-Table kann zwar nur von einer, der aktuellen
Verbindung gesehen werden, aber von zweien genutzt
werden.(siehe Manual ?) Also müßte es damit gehen.(?)
Was bedeutet "privilege" ("...you must have the
CREATE TEMPORARY TABLES privilege")?
Die müßte ich doch beim einloggen haben?

Daher habe ich es bisher prinzipiell (noch) so:

1. Datenbank 1 auswählen: $db1 = mysql_pconnect($db_server,$user1,$passw1);
2. msql_query("CREATE TEMPORARY TABLE temp-table ...)
3. msql_query("INSERT INTO temp-table ...
SELECT ...)
4. Datenbank 2 auswählen: $db2 = mysql_pconnect($db_server,$user2,$passw2);
5. $result = mysql_query("SELECT temp-table,table1,...
FROM Datenbank 1, Datenbank 2 ...

obwohl über mysql_pconnect passende Daten eingegeben:

Datenbank 1c23 wurde ausgewählt
aber: kein INSERT: Access denied for user: '1c23@%' to database 'ccc'

Wie gesagt, bei mir klappt alles. Bei all-inkl.com scheints
vor allem am INSERT zu haken. Habe ich da noch was übersehen?

------

zum DB dumpen, um mit dieser dann kurz zu arbeiten:

exec("mysqldump -u 1c23 -p PW --add-drop-table ccc >dump.sql");

damit bin ich auch nicht weitergekommen.
Es gab hier eine Fehlermeldung:

Datenbank 1c23 wurde ausgewählt
Warning: exec() has been disabled for security reasons in
/www/htdocs/.../index.php on line 234
fertig...

kein INSERT: Access denied for user: '1c23@%' to database 'ccc'


Ich frag noch bei all-inkl, ... sonst muß ich
alles in eine DB packen :-(


Danke noch,
viele Grüße, Frida

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 24.08.2006 16:59:01 von Thomas Rachel

Frida Mertens wrote:

> Tag nochmal,
> ich bin leider noch nicht weiter gekommen.
>
> ------
>
> ein Temp-Table kann zwar nur von einer, der aktuellen
> Verbindung gesehen werden, aber von zweien genutzt
> werden.(siehe Manual ?) Also müßte es damit gehen.(?)

Worauf stützt Du diese Vermutung? Meinst Du

| A TEMPORARY table is visible only to the current connection, and is
| dropped automatically when the connection is closed. This means that two
| different connections can use the same temporary table name without
| conflicting with each other or with an existing non-TEMPORARY table of the
| same name. (The existing table is hidden until the temporary table is
| dropped.)

Das bedeutet, daß der Name doppelt verwendet werden kann, gerade eben weil
die TempTables pro Verbindung zugewiesen werden. Das bedeutet aber auch,
daß kein Querzugriff möglich ist.

Zumal Temptables auch datenbankbezogen sind - nach einem USE db2 ist eine
TempTable, die in db1 angelegt wurde, nicht mehr verfügbar; nach einem USE
db1 gehts wieder.


> Was bedeutet "privilege" ("...you must have the
> CREATE TEMPORARY TABLES privilege")?
> Die müßte ich doch beim einloggen haben?

Zugangsberechtigung. Da gibts auch ein Kapitel im Handbuch drüber. Ob Du die
hast, hängt von Deinem Provider ab.
>
> Daher habe ich es bisher prinzipiell (noch) so:
>
> 1. Datenbank 1 auswählen:

Du meinst: Verbindung 1 ausählen.

> $db1 = mysql_pconnect($db_server,$user1,$passw1);

mysql_pconnect ist sehr problematisch und daher nach Möglichkeit zu
vermeiden.

Fehlt da irgendwo ein mysql_select_db()?


> 2. msql_query("CREATE TEMPORARY
> TABLE temp-table ...)

> 3. msql_query("INSERT INTO temp-table ...
> SELECT ...)

Hast Du da wirklich msql oder mysql stehen?


> 4. Datenbank 2 auswählen:
> $db2 = mysql_pconnect($db_server,$user2,$passw2);

> 5. $result =
> mysql_query("SELECT temp-table,table1,... FROM Datenbank 1, Datenbank 2
> ...


> obwohl über mysql_pconnect passende Daten eingegeben:
>
> Datenbank 1c23 wurde ausgewählt
> aber: kein INSERT: Access denied for user: '1c23@%' to database 'ccc'

Verstehe ich jetzt grad nicht... vielleicht wirklich unpassende Rechte, z.B.
für CREATE TEMPORARY TABLE?

Probier mal den MySQL-Befehl "SHOW GRANTS" aus. Der gibt ein Result-Set
zurück (also abfragen mit query, while fetch_row... -> wie bei einem
SELECT)

> Wie gesagt, bei mir klappt alles.

Das wundert mich; normal solltest Du von Conn2 aus nicht auf die temp-table
draufkommen.

> zum DB dumpen, um mit dieser dann kurz zu arbeiten:
>
> exec("mysqldump -u 1c23 -p PW --add-drop-table ccc >dump.sql");
>
> damit bin ich auch nicht weitergekommen.
> Es gab hier eine Fehlermeldung:
>
> Datenbank 1c23 wurde ausgewählt
> Warning: exec() has been disabled for security reasons in
> /www/htdocs/.../index.php on line 234

Das ist ein PHP-Problem - Dein Hoster hat exec() vermutlich gesperrt, d.h.
Du mußt Dir da per PHP selbst was zusammenbauen, um die Daten zu
exportieren.


> Ich frag noch bei all-inkl, ... sonst muß ich
> alles in eine DB packen :-(

Wird dann wokl nix anderes übrig bleiben.

Wäre das denn prinzipiell ein Problem? Kommen die Daten aus verschiedenen
Quellen?


Thomas
--
Du verwexelst da was: Chinin ist das, was den Lemon bitter macht. Das,
was die BigMäcs und den Chefsalate so schön knackig macht, heißt Chitin.
Hartmut Lehmann in de.alt.folklore.urban-legends

Re: Select aus 2 Datenbanken mit 2 Kennungen (name, passwort)

am 28.08.2006 17:32:36 von Frida Mertens

Hallo Thomas,
Danke!
mit exec klappt es nach einem Kontakt mit dem
Hoster doch
es würde mit den alten MySqls so funktionieren:

Dump erzeugen:

exec("mysqldump -u LOGIN -pPASSWORT --add-drop-table LOGIN >dump" .
date('Ymd_g_i') . ".sql");
exec("gzip dump" . date('Ymd_g_i') . ".sql");

in andere DB schreiben:

exec("gunzip dumpDATUM.sql.gz");
exec("mysql -u LOGIN -pPASSWORT LOGIN < dumpDATUM.sql");

Select ...
.... dumps wieder löschen.


ich habe aber Tables in eine DB zusammengeworfen, da
momentan zu kompliziert ... und ich mal auf MySql 5
umsteige und dann mal sehen obs besser geht ...

Grüße, ciao, Frida