PHP naar twee mysql databases in 1 query

Pagina: 1
Acties:
  • 182 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
hoi,

Dit is waarschijnlijk een hele lastige vraag.

Ik heb dus 2 mysql databases met 2 verschillende logins, is het mogelijk om met 1 query iets uit beide databases te lezen?

Ik weet dat het mogelijk is om twee databases te selecten die tot 1 user behoren. Dus dat is niet wat ik wil. Elke database heeft zun eigen login/password bij zich.

Is het mogelijk om 2x mysql_connect() te doen oid?
Of ook als een tweede user aan te melden. (Zodat rechten worden uitgebreid)

Bij voorbaat dank, ;)

Marcel.

Acties:
  • 0 Henk 'm!

  • djluc
  • Registratie: Oktober 2002
  • Laatst online: 14:28
Heb je al eens de handleiding gelezen? select from database.tabel etcetera.

Acties:
  • 0 Henk 'm!

  • Stamgastje
  • Registratie: April 2003
  • Laatst online: 02-02-2020
Je moet dan mysql_connect() aanroepen met een user die toegang heeft tot beide databases en dan idd een query gebruiken zoals djluc hierboven al aangeeft:

SELECT `t1`.*, `t2`.* FROM `database1`.`table1` AS `t1`, `database2`.`table2` AS `t2` WHERE ...

Acties:
  • 0 Henk 'm!

  • Tux
  • Registratie: Augustus 2001
  • Laatst online: 21:12

Tux

Twee verbindingen is opzich wel mogelijk. Alleen is het niet mogelijk om twee verbindingen in één query te betrekken. Dus de enige oplossing is: zorg ervoor dat er een account is met toegang tot beide databases.

The NS has launched a new space transportation service, using German trains which were upgraded into spaceships.


Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
Hij geeft aan dat het verschillende users zijn, je moet dus inderdaad 2x mysql_connect gebruiken.

PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
mysql_connect("localhost","user1","");
mysql_select_db("database1");

$query = mysql_query("SELECT * FROM tabel");

mysql_close();
mysql_connect("localhost","user2","");
mysql_select_db("database2");

$query = mysql_query("SELECT * FROM tabel");

mysql_close();
?>


Je kan ook wel gaan werken met resources ( $var = mysql_connect.. ), maar dat is niet echt handig voor dit soort situaties. Wel als je nog meer queries op DB1 wilt doen bijv.

Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
dus geen multiuser omgeving is mogelijk? Dat met resources had ik al door. Maar als je bijvoorbeeld:

PHP:
1
2
3
4
5
6
7
$db1 = mysql_connect("localhost","user1","");
mysql_select_db("database1",$db1); 

$db2 = mysql_connect("localhost","user2","");
mysql_select_db("database2",$db2); 

$query = mysql_query("SELECT database1.tabel1.*, database2.tabel1.veld3 FROM database1.tabel1, database2.tabel1");


Dat wil niet, omdat hij dan met de laatste gemaakte verbinding die query gaat uitvoeren.

En ja djluc ik heb de handleiding gelezen, maar waarschijnlijk heb jij mijn hele post niet gelezen :(

Stamgastje: Er is geen van beide users die bij beide tabellen kan.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Dan zul je toch echt om meer rechten moeten vragen. Er is geen andere optie denk ik.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Stamgastje
  • Registratie: April 2003
  • Laatst online: 02-02-2020
Deikke schreef op zondag 06 maart 2005 @ 16:24:Stamgastje: Er is geen van beide users die bij beide tabellen kan.
En kan je niet zelf een user aanmaken die wel bij beide databases kan?

Ik ben er namelijk even van uitgegaan dat je de mysql server zelf beheert; in dat geval is de meest logische oplossing namelijk om gewoon een extra gebruiker aan te maken die voldoende rechten heeft op beide databases.

Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
Het probleem is dat gare cpanel, het zijn twee verschillende accounts die een user database delen. Maar toch een apart login systeem hebben. Maar cpanel zet er zo'n lekkere prefix voor dat het wel mogelijk is om database te delen. Maar niet om een eigen bedachte naam op te geven zonder die smerige username prefix :(.

En nee, ik beheer de server niet. En de andere account is ook niet van mij.

Acties:
  • 0 Henk 'm!

Verwijderd

resource mysql_query ( string query [, resource link_identifier] )
Begrijp ik het nou goed dat je gewoon bij je query je database object kan meegeven?

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Verwijderd schreef op zondag 06 maart 2005 @ 17:58:
[...]

Begrijp ik het nou goed dat je gewoon bij je query je database object kan meegeven?
Nee, je kunt je connectie identifier meegeven. Voor 1 user dus.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Deikke
  • Registratie: Juni 2004
  • Laatst online: 06:44
je kan toch maar 1 database verbinding in zo'n database object kwijt?
Het hele punt is dat er twee gebruikers zijn die elkaars database niet kan lezen, maar wel elkaars database willen lezen in 1 query.

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
Je zult toch echt de data handmatig moeten koppelen. Er zit weinig anders op denk ik.

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • Rvanlaak
  • Registratie: Juni 2005
  • Laatst online: 19-09 10:52
Mijn probleem past het beste bij deze topic denk ik. Wat het namelijk dus is, is dat mijn domein verhuisd wordt. Er is dus een periode van overlap, en hierbij worden beide versies van dezelfde site gebruikt. Nu wil ik dus op een simpele manier dat alle INSERT, UPDATE en DELETE queries op beide databases worden uitgevoerd zodat de gegevens recent blijven en de overgang soepel blijft verlopen.

Wat is een slimme oplossing om deze queries dubbel uit te voeren, of is er een andere synchronisatie optie? Het is een PHP/MySQL combinatie

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Dit probleem past totaal niet in dit topic, je kan beter een uitgebreid nieuw topic starten met informatie over beide setups, hoeveel controle je hebt over het beheer etc etc.

En kan je niet dmv eerst je dns ttl verlagen er voor zorgen dat de periode van overlap korter wordt, zodat het minder erg is als de oude locatie uit gaat of beperkt wordt qua functionaliteit?

{signature}


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

Kijk eens naar MySQL Master/Slave replicatie.

[ Voor 5% gewijzigd door Niemand_Anders op 11-01-2008 12:01 ]

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Niemand_Anders schreef op vrijdag 11 januari 2008 @ 12:01:
Kijk eens naar MySQL Master/Slave replicatie.
Lijkt mij dat dat erg lastig te realiseren is tussen 2 verschillende partijen. Kan me voorstellen dat je als hoster niet wil dat een mySQL naar buiten toe open staat.

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Rvanlaak schreef op vrijdag 11 januari 2008 @ 11:21:
Mijn probleem past het beste bij deze topic denk ik. Wat het namelijk dus is, is dat mijn domein verhuisd wordt. Er is dus een periode van overlap, en hierbij worden beide versies van dezelfde site gebruikt. Nu wil ik dus op een simpele manier dat alle INSERT, UPDATE en DELETE queries op beide databases worden uitgevoerd zodat de gegevens recent blijven en de overgang soepel blijft verlopen.

Wat is een slimme oplossing om deze queries dubbel uit te voeren, of is er een andere synchronisatie optie? Het is een PHP/MySQL combinatie
Maak een database abstractie klasse, zoals:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MysqlDatabase {
private $connection1;
private $connection2;

function MySqlDatabase() {
  //maak verbindingen met je database, etc
}
function doQuery($query) {
  //indien query insert, update of delete is voor het op beide connectie uit
  //anders op 1 van de 2.
}
function fetchArray($qres) {
}
}


Mooi, nee, maar het werkt wel.

Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
Robbert, als je in het script zelf al een actieve verbinding met de andere db maakt, waarom zouden beide scripts niet gewoon enkel naar dezelfde db (die van de nieuwe locatie) kunnen connecten. :Y)
De oude locatie ervaart dan slechtere select performance, maar dat is van tijdelijke duur en de nieuwe locatie werkt gewoon goed. Bovendien moet je bij jouw aanpak wegens het niet duidelijk zijn van een master ook heel goed over race condities nadenken.

{signature}


Acties:
  • 0 Henk 'm!

  • robbert
  • Registratie: April 2002
  • Laatst online: 20:37
Voutloos schreef op vrijdag 11 januari 2008 @ 12:21:
Robbert, als je in het script zelf al een actieve verbinding met de andere db maakt, waarom zouden beide scripts niet gewoon enkel naar dezelfde db (die van de nieuwe locatie) kunnen connecten. :Y)
Lijkt me inderdaad beter.
Bovendien moet je bij jouw aanpak wegens het niet duidelijk zijn van een master ook heel goed over race condities nadenken.
Daar had ik inderdaad niet aan gedacht...

Acties:
  • 0 Henk 'm!

  • FragFrog
  • Registratie: September 2001
  • Laatst online: 09:34
TeeDee schreef op vrijdag 11 januari 2008 @ 12:03:
Lijkt mij dat dat erg lastig te realiseren is tussen 2 verschillende partijen. Kan me voorstellen dat je als hoster niet wil dat een mySQL naar buiten toe open staat.
Dat zal toch wel moeten, of je moet transaction logs gaan bijhouden :)

Op zich is master/slave replicatie trouwens best goed te doen hoor, zeker als je de master server zelf in beheer hebt en 'm gewoon open kan stellen voor de replication slave, is het een kwestie van op beide locaties verwijzen naar de master server voor alles behalve selects en zodra de overgang compleet is de master of de slave killen.

Alternatief kun je natuurlijk ook eerst de database op je oude locatie gebruiken, die openstellen voor de webserver op de nieuwe locatie en daar in de config het IP gebruiken. Zodra de DNS over is een backup overpompen, oude DB killen, nieuwe importeren en daarnaar verwijzen, stuk simpeler maar iets meer downtime :)

[ Site ] [ twitch ] [ jijbuis ]


Acties:
  • 0 Henk 'm!

  • Niemand_Anders
  • Registratie: Juli 2006
  • Laatst online: 09-07-2024

Niemand_Anders

Dat was ik niet..

TeeDee schreef op vrijdag 11 januari 2008 @ 12:03:
[...]

Lijkt mij dat dat erg lastig te realiseren is tussen 2 verschillende partijen. Kan me voorstellen dat je als hoster niet wil dat een mySQL naar buiten toe open staat.
Als je vanuit PHP naar beide partijen een MySQL connectie kunt opzetten, kun je ook MySQL replication gebruiken. Kun je niet vanaf de nieuwe/oude locatie beide database bereiken. Dat is een simpelere oplossing gewoon een website redirect.

If it isn't broken, fix it until it is..


Acties:
  • 0 Henk 'm!

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 21:07

TeeDee

CQB 241

Niemand_Anders schreef op vrijdag 11 januari 2008 @ 13:31:
[...]
Als je vanuit PHP naar beide partijen een MySQL connectie kunt opzetten, kun je ook MySQL replication gebruiken.
Blegh, daar had ik inderdaad niet bij stil gestaan. Als er al connectie is, dan gaat het prima natuurlijk.

[ Voor 17% gewijzigd door TeeDee op 11-01-2008 13:35 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


Acties:
  • 0 Henk 'm!

  • Voutloos
  • Registratie: Januari 2002
  • Niet online
DB's in sync houden is gewoon niet eenvoudig, dus ik zou het niet zomaar introduceren voor een enkele onderhoudsactie. Tenzij het echt een bedrijfskritische site is en de andere oplossingen niet goed genoeg zijn, maar in dat geval had je wellicht al een redundante setup geregeld moeten hebben op dit moment. ;)

{signature}

Pagina: 1