Page 1 sur 1

Copie et mise à jour de tables dans des bases différentes

Posté : 05 sept. 2022, 15:05
par moryason
Bonjour à tous,

Je suis débutant en PHP MYSQL et je suis en train de développer un script de synchronisation des adhérents d'une association entre 2 bases de données différentes. En fait je possède 2 applications web qui ont chacune leurs bases et il faudrait que la table adhérent de la base1 soit la base temp_users de la base 2.

La table maître est adherents sur bdd1 et la table temp_users sur bdd2 se met à jour lorsqu'on lance le script...

Voici le code de ce que j'ai développé mais cela ne fonctionne pas et je ne comprends pas pourquoi :

Code : Tout sélectionner

<? // BASE 2 $host2 = "XXXXXXX"; $user2 = "XXXXXXX"; $pass2 = "XXXXXXX"; $nbdd2 = "bdd2"; //BASE 1 $host1 = "XXXXXX"; $user1 = "XXXXXX"; $pass1 = "XXXXXX"; $nbdd1 = "bdd1"; // nom de la BD $bdd1 = mysqli_connect($host1,$user1,$pass1,$nbdd1); $bdd2 = mysqli_connect($host2,$user2,$pass2,$nbdd2); $ReqTable1 = mysqli_query($bdd1,"SELECT rowid FROM adherent"); $ReqTable2 = mysqli_query($bdd2,"SELECT rowid FROM temp_users"); // définition des nombres d'entrées $entreestable1 = mysqli_num_rows($ReqTable1); $entreestable2 = mysqli_num_rows($ReqTable2); //affichage des entrées : echo "Table 1 : "; printf ("%d \n", $entreestable1); echo "Table 2 : "; printf ("%d \n", $entreestable2); echo "<br />"; //1-vérification des tables //Si la table d'origine contient moins d'adhérents que la table destination if ($entreestable1 < $entreestable2) { //1-Vidage de la table destination bdd2 mysqli_query($bdd2,"TRUNCATE table bdd2.temp_users"); echo "table vidée <br />"; //2-selection des colonnes id-ref pour avoir la correspondance de la table bdd1.adherent $res1 = mysqli_query($bdd1,"SELECT * FROM bdd1.adherent") or die("<pre><b>MySQL Error:<b/>". mysqli_error($bdd1) ."</pre>"); while ($row1 = mysqli_fetch_array($res1, MYSQLI_BOTH)) { // 3-copie des colonnes de bdd1.adherent dans bdd2.temp_users mysqli_query($bdd2,"INSERT INTO bdd2.temp_users VALUES ('".mysqli_real_escape_string($bdd2,$row1['rowid'])."','".mysqli_real_escape_string($bdd2,$row1['ref'])."','".mysqli_real_escape_string($bdd2,$row1['entity'])."','".mysqli_real_escape_string($bdd2,$row1['ref_ext'])."','".mysqli_real_escape_string($bdd2,$row1['gender'])."','".mysqli_real_escape_string($bdd2,$row1['civility'])."','".mysqli_real_escape_string($bdd2,$row1['lastname'])."','".mysqli_real_escape_string($bdd2,$row1['firstname'])."','".mysqli_real_escape_string($bdd2,$row1['login'])."','".mysqli_real_escape_string($bdd2,$row1['pass'])."','".mysqli_real_escape_string($bdd2,$row1['pass_crypted'])."','".mysqli_real_escape_string($bdd2,$row1['fk_adherent_type'])."','".mysqli_real_escape_string($bdd2,$row1['morphy'])."','".mysqli_real_escape_string($bdd2,$row1['societe'])."','".mysqli_real_escape_string($bdd2,$row1['fk_soc'])."','".mysqli_real_escape_string($bdd2,$row1['address'])."','".mysqli_real_escape_string($bdd2,$row1['zip'])."','".mysqli_real_escape_string($bdd2,$row1['town'])."','".mysqli_real_escape_string($bdd2,$row1['state_id'])."','".mysqli_real_escape_string($bdd2,$row1['country'])."','".mysqli_real_escape_string($bdd2,$row1['email'])."','".mysqli_real_escape_string($bdd2,$row1['socialnetworks'])."','".mysqli_real_escape_string($bdd2,$row1['phone'])."','".mysqli_real_escape_string($bdd2,$row1['phone_perso'])."','".mysqli_real_escape_string($bdd2,$row1['phone_mobile'])."','".mysqli_real_escape_string($bdd2,$row1['birth'])."','".mysqli_real_escape_string($bdd2,$row1['photo'])."','".mysqli_real_escape_string($bdd2,$row1['statut'])."','".mysqli_real_escape_string($bdd2,$row1['public'])."','".mysqli_real_escape_string($bdd2,$row1['datefin'])."','".mysqli_real_escape_string($bdd2,$row1['note_private'])."','".mysqli_real_escape_string($bdd2,$row1['note_public'])."','".mysqli_real_escape_string($bdd2,$row1['model_pdf'])."','".mysqli_real_escape_string($bdd2,$row1['datevalid'])."','".mysqli_real_escape_string($bdd2,$row1['datec'])."','".mysqli_real_escape_string($bdd2,$row1['tms'])."','".mysqli_real_escape_string($bdd2,$row1['fk_user_author'])."','".mysqli_real_escape_string($bdd2,$row1['fk_user_mod'])."','".mysqli_real_escape_string($bdd2,$row1['fk_user_valid'])."','".mysqli_real_escape_string($bdd2,$row1['canvas'])."','".mysqli_real_escape_string($bdd2,$row1['import_key'])."','".mysqli_real_escape_string($bdd2,$row1['url'])."')") or die("<pre><b>MySQL Error:<b/>". mysqli_error($bdd2) ."</pre>"); } echo"Copie de la base effectuée <br />"; } elseif ($entreestable1 > $entreestable2) //si table d'origine est supérieure à table destination { echo"Mise à jour de la table destination <br />"; // 4-MAJ des nouveaux membres echo"mise à jour des membres en cours ! <br />"; mysqli_query($bdd1,"INSERT INTO bdd2.temp_users SELECT * FROM bdd1.adherent WHERE rowid NOT IN (SELECT rowid FROM bdd2.temp_users)"); echo" - Sélection copiée <br />"; } else { echo "Les deux tables sont identiques <br />"; } // 5-MAJ statuts actifs/inactifs. Si pas actifs "1" alors "0" echo"Mise à jour des statuts <br />"; $result2 = mysqli_query($bdd1,"SELECT statut from bdd1.adherent WHERE statut != '1'" )or die("<pre><b>MySQL Error:<b/>". mysqli_error($bdd1) ."</pre>"); while ($row3 = mysqli_fetch_array($result2, MYSQLI_BOTH)) { mysqli_query ($bdd2,"UPDATE bdd2.temp_users SET statut = '0'"); echo "désactivation de $row3[firstname]<br />"; } echo " - MAJ des nouveaux membres effectuée <br /> Vous pouvez fermer cette fenêtre"; ?>[/color]
Si une âme charitable pouvait m'aider ce serait super... Un grand merci.

Re: Copie et mise à jour de tables dans des bases différentes

Posté : 05 sept. 2022, 15:19
par Saian
Salut, à priori tu ne peux pas faire un insert select en utilisant des tables de 2 bases de données différentes.

Tu dois avoir à minima une erreur sur cette requête
mysqli_query($bdd1,"INSERT INTO bdd2.temp_users SELECT * FROM bdd1.adherent WHERE rowid NOT IN (SELECT rowid FROM bdd2.temp_users)");

Tu essaies d'insérer quelque chose dans bdd2 en utilisant la connexion à bdd1...

Tu devrais tester le retour de chaque mysqli_query afin de t'afficher l'erreur s'il y en a une ou mettre systématiquement un or die au moins le temps de débuguer ton script.

EDIT : bon alors peut être que tu pourrais, il faudrait ouvrir une seule connexion, sans spécifier la base de données et avec un utilisateur ayant accès aux 2 bases de données.

Les requêtes avec noms de tables préfixées par les noms des bases de données devraient alors fonctionner.

A tester. Si ça ne fonctionne pas avec mysqli tu peux aussi essayer le même principe avec PDO.

Re: Copie et mise à jour de tables dans des bases différentes

Posté : 05 sept. 2022, 17:46
par moryason
Ok je te remercie, je vais tester ça !

(Moi aussi ça m'arrive de rééditer des posts :) )

Re: Copie et mise à jour de tables dans des bases différentes

Posté : 05 sept. 2022, 18:13
par moryason
Effectivement, j'ai un problème de droits d'accès sur la requête que tu as soulignée...
MySQL Error:SELECT command denied to user 'user2'@'xxxxxxxx' for table 'adherent'

adherent est sur la base1.... Je ne connais pas PDO, je vais regarder. Sinon le même utilisateur me semble être une bonne idée ! :idea:

EDIT : J'ai donné aux 2 utilisateurs des bases les droits sur l'autre base ! Et ça marche !!!
Bon en revanche la mise à jours des statuts des membres met tout à 0 dans la table temp_users de la bdd2....