IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Connexion entre 2 bases sur 2 serveur différents [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut Connexion entre 2 bases sur 2 serveur différents
    Bonjour a tous,

    Est-ce que qqu'un pourrait m'aider à adapter ma requête pour qu'elle fonctionne pour 2 BDD différentes installées sur 2 Serveurs différents également?

    Ici j'arrive à la faire fonctionner pour autant que les 2 BBD soient sur un seul serveur.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $sql = "insert into slave.gghf_table SELECT * from master.gghf_table2 WHERE NOT exists (SELECT * FROM slave.gghf_table where gghf_table.newid = gghf_table2.newid) ";
     
    // on envoie la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    Merci pour votre aide

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Je n'ai pas la réponse à ta question; cependant n'as-tu pas pensé à découper ton traitement en plusieurs requêtes ?
    Es-tu bloqué par une contrainte de performance (trop de données) ?

    Dans le cas contraire, je pensais faire ainsi :
    1. Selectionner toutes les lignes sur le master (certes, lourd)
    2. Boucler sur les résultats
    3. Si la ligne n'est pas présente sur le slave, on l'insert


    Cela est bien entendu peu performant, cependant ça devrait fonctionner.
    Je propose cela puisque ton code semble être une requête que l'on exécute très occasionnellement, pour une resynchro ou une migration de donnée.

  3. #3
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Salut,

    Merci pour ta suggestion.

    Par contre j'ai reçu un mail concernant une réponse à ma demande mais la réponse ne s'affiche pas à la suite de ce topic et j'ignore pourquoi.

    Voici tout de même ce qui m'a été répondu et que je remercie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $connexion1 = mysql_connect($host1, $user1, $pass1);
    mysql_select_db('slave', $connexion1);
    $connexion2 = mysql_connect($host2, $user2, $pass2);
    mysql_select_db('master', $connexion2);
     
    $sql1= "SELECT * from master.gghf_table2 WHERE NOT exists (SELECT * FROM slave.gghf_table where gghf_table.newid = gghf_table2.newid)";
    $resultats1 = mysql_query($sql1, $connexion1);
     
    if($resultats1){
    while ($row = mysql_fetch_assoc($resultats1)) {
    $sql2 = "INSERT INTO gghf_table(".implode("," array_key($row)).") VALUES (".implode("," $row).")";
    $resultats2 = mysql_query($sql2, $connexion2);
    }
    }
    Je vais tester cela.

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Ok, si le script qui t'as été transmis fonctionne tu devrais alors passer le topic à

  5. #5
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    En testant j'ai une erreur de type:
    Parse error: syntax error, unexpected T_STRING

    A cette ligne 11:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql2 = "INSERT INTO gghf_table(".implode("," array_key($row)).") VALUES (".implode("," $row).")";
    Ca dépasse mes compétences pour corriger.

    Merci pour l'aide ;-)

  6. #6
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    J'ai cherché une erreur de syntaxe mais je n'en ai pas trouvé.
    J'ai donc regardé la doc pour les deux fonctions appelées : il s'avère que array_key ne semble pas fonctionner, remplace par array_keys peut-être.

  7. #7
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Effectivement c'est bien une faute.

    J'ai donc remplacé par "array_keys" mais l'erreur est toujours présente malgré
    cela.

    Que faire d'autant plus que ce code fourni ne provient de personne apparemment et je ne sais pas non plus m'adresser à celle-ci.

  8. #8
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Oui et ce code sans autres commentaire c'est pas super non plus.
    Pour ma part, je pense qu'il ne fonctionne pas, car si on prends ces quelques lignes séparément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $connexion1 = mysql_connect($host1, $user1, $pass1);
    mysql_select_db('slave', $connexion1);
     
    $sql1= "SELECT * from master.gghf_table2 WHERE NOT exists (SELECT * FROM slave.gghf_table where gghf_table.newid = gghf_table2.newid)";
    $resultats1 = mysql_query($sql1, $connexion1);
    Si on effectue cette requête sur $connexion1 alors la table "master.gghf_table2" n'existera pas.

  9. #9
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Mouais c'est pas super çà qu'il n'y a pas moyen à partir de cette requête.

    Sinon sans vouloir abuser, peux-tu m'expliquer le développement de la requête que tu proposais ?

  10. #10
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Je voyais un truc comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
     
    // Connexion slave sur $connexion1
    $connexion1 = mysql_connect($host1, $user1, $pass1);
    mysql_select_db('slave', $connexion1);
     
    // Connexion master sur $connexion2
    $connexion2 = mysql_connect($host2, $user2, $pass2);
    mysql_select_db('master', $connexion2);
     
    // On prends toutes les lignes du master
    $sql= "SELECT * from master.gghf_table2";
    $resultats1 = mysql_query($sql, $connexion2);
     
    // On boucle sur toute la table
    while($ligneMaster = mysql_fetch_assoc($resultat1)){
     
    	// On recherche sur le slave la ligne d'id correspondant
    	$sql = "SELECT * FROM slave.gghf_table where gghf_table.newid = " . $ligneMaster['newid'] . ";";
    	$resultats2 = mysql_query($sql1, $connexion1);
     
    	if( !mysql_fetch_assoc($resultat2) ) { // Si on en trouve aucune; équivalent du "NOT EXISTS" dans ta requête
     
    		// Alors on insert dans le slave les données de la ligne du master
    		$sql = "INSERT INTO gghf_table(".implode("," array_keys($ligneMaster)).") VALUES (".implode("," $ligneMaster).")";
    		$resultats2 = mysql_query($sql2, $connexion2);
    	}
    }
     
    ?>
    Je n'ai pas testé, c'est pour donner l'idée en gros.
    A vérifier que la requete d'insert fonctionne avec le implode, notamment pour les valeurs avec des guillemets il y aura probablement une erreur.
    Réécrire l'insert champs par champs pour être sur.

  11. #11
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Un grand merci à toi pour ton aide.

    J'avais bien une erreur avec le "implode".
    J'ai donc modifié comme suit:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    <?php
     
    // Connexion slave sur $connexion1
    $connexion1 = mysql_connect($host1, $user1, $pass1);
    mysql_select_db('slave', $connexion1);
     
    // Connexion master sur $connexion2
    $connexion2 = mysql_connect($host2, $user2, $pass2);
    mysql_select_db('master', $connexion2);
     
    // On prends toutes les lignes du master
    $sql= "SELECT * from master.gghf_table2";
    $resultats1 = mysql_query($sql, $connexion2);
     
    // On boucle sur toute la table
    while($ligneMaster = mysql_fetch_assoc($resultat1)){
     
    	// On recherche sur le slave la ligne d'id correspondant
    	$sql = "SELECT * FROM slave.gghf_table where gghf_table.newid = " . $ligneMaster['newid'] . ";";
    	$resultats2 = mysql_query($sql1, $connexion1);
     
    	if( !mysql_fetch_assoc($resultat2) ) { // Si on en trouve aucune; équivalent du "NOT EXISTS" dans ta requête
     
    		// Alors on insert dans le slave les données de la ligne du master
    		$sql = "INSERT INTO gghf_table(rando, nom, prenom, rue, code, postal,newid) VALUES ("'.$ligneMaster['rando'].'","'.$ligneMaster['nom'].'","'.$ligneMaster['prenom'].'","'.$ligneMaster['rue'].'","'.$ligneMaster['code'].'","'.$ligneMaster['postal'].'","'.$ligneMaster['newid'].'" )';
    		$resultats2 = mysql_query($sql2, $connexion2);
    	}
    }
     
    ?>

    Par contre voici tout de même 2 autres messages d'erreur:

    Notice: Undefined variable: resultat1
    pour cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while($ligneMaster = mysql_fetch_assoc($resultat1)){
    et

    Warning: mysql_fetch_assoc() expects parameter 1 to be resource, null given

    également pour cette même ligne.

  12. #12
    Membre actif
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    433
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations forums :
    Inscription : Avril 2007
    Messages : 433
    Points : 240
    Points
    240
    Par défaut
    Oui en effet en tappant vite j'ai fais une faute, si tu regardes bien il y a un "s" à "resultat" sur la ligne du dessus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $resultats1 = mysql_query($sql, $connexion2);

  13. #13
    Membre habitué Avatar de legrandse
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Décembre 2010
    Messages
    350
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Décembre 2010
    Messages : 350
    Points : 149
    Points
    149
    Par défaut
    Superbe ! Tout fonctionne à merveille. Un grand merci à toi.

    J'ai juste modifié qques babioles pour que cela tourne parfaitement.

    Voici le code finalisé:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    <?php
     
    $host1 = 'xxxx';
    $user1 = 'xxxxxx';
    $pass1 = 'xxxxxx';
     
    $host2 = 'lyyyyy';
    $user2 = 'yyyy';
    $pass2 = 'yyyyyy';
     
     
    // Connexion slave sur $connexion1
    $connexion1 = mysql_connect($host1, $user1, $pass1);
    mysql_select_db('slave', $connexion1);
     
    // Connexion master sur $connexion2
    $connexion2 = mysql_connect($host2, $user2, $pass2);
    mysql_select_db('master', $connexion2);
     
    // On prends toutes les lignes du master
    $sql= "SELECT * from master.gghf_table2";
    $resultats1 = mysql_query($sql, $connexion2);
     
    // On boucle sur toute la table
    while($ligneMaster = mysql_fetch_assoc($resultats1)){
     
    	// On recherche sur le slave la ligne d'id correspondant
    	$sql1 = "SELECT * FROM slave.gghf_table where gghf_table.newid = " . $ligneMaster['newid'] . ";";
    	$resultats2 = mysql_query($sql1, $connexion1);
     
    	if( !mysql_fetch_assoc($resultats2) ) { // Si on en trouve aucune; équivalent du "NOT EXISTS" dans ta requête
     
    		// Alors on insert dans le slave les données de la ligne du master
    		$sql2 = "INSERT INTO gghf_table(rando, nom, prenom, rue, code, postal,newid) VALUES ("'.$ligneMaster['rando'].'","'.$ligneMaster['nom'].'","'.$ligneMaster['prenom'].'","'.$ligneMaster['rue'].'","'.$ligneMaster['code'].'","'.$ligneMaster['postal'].'","'.$ligneMaster['newid'].'" )';
    		$resultats2 = mysql_query($sql2, $connexion1);
    	}
    }
     
    ?>

  14. #14
    Membre éprouvé Avatar de vorace
    Homme Profil pro
    Développeur
    Inscrit en
    Août 2010
    Messages
    573
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur

    Informations forums :
    Inscription : Août 2010
    Messages : 573
    Points : 915
    Points
    915
    Par défaut
    Citation Envoyé par legrandse Voir le message
    Salut,

    Merci pour ta suggestion.

    Par contre j'ai reçu un mail concernant une réponse à ma demande mais la réponse ne s'affiche pas à la suite de ce topic et j'ignore pourquoi.

    Voici tout de même ce qui m'a été répondu et que je remercie.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $connexion1 = mysql_connect($host1, $user1, $pass1);
    mysql_select_db('slave', $connexion1);
    $connexion2 = mysql_connect($host2, $user2, $pass2);
    mysql_select_db('master', $connexion2);
     
    $sql1= "SELECT * from master.gghf_table2 WHERE NOT exists (SELECT * FROM slave.gghf_table where gghf_table.newid = gghf_table2.newid)";
    $resultats1 = mysql_query($sql1, $connexion1);
     
    if($resultats1){
    while ($row = mysql_fetch_assoc($resultats1)) {
    $sql2 = "INSERT INTO gghf_table(".implode("," array_key($row)).") VALUES (".implode("," $row).")";
    $resultats2 = mysql_query($sql2, $connexion2);
    }
    }
    Je vais tester cela.
    C'est moi qui t'es posté ce code, il devait être 4 ou 5 heure du matin et je me suis aperçu par la suite que dans ta requête tu testé l'existence de la ligne dans ta base avant de l'insérer...ce que je n'avais pas prévu dans mon code. Je ne pensé pas qu'en supprimant le message il te l'enverrait quand même. Pour les "commentaires" on ne peut pas avoir le beurre, l'argent du beurre et la crémière...mais merci quand même !!!
    Développeur informatique contrarié...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Solution de transfert de fichier entre 2 applications sur 2 serveurs différents
    Par garthos dans le forum Développement Web en Java
    Réponses: 5
    Dernier message: 15/04/2013, 13h56
  2. [WD15] 2 bases sur 2 serveurs différents. Comment faire un ALIAS
    Par EriCstoFF dans le forum WinDev
    Réponses: 7
    Dernier message: 29/12/2010, 14h32
  3. Réponses: 2
    Dernier message: 18/02/2009, 14h16
  4. Réponses: 1
    Dernier message: 15/05/2008, 18h45
  5. [SQL-Server] Connexion entre SQL Server et IIS sur 2 serveurs différents
    Par kenzo080 dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 06/09/2006, 11h50

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo