Comment identifies-tu tes tuples ?
Version imprimable
Comment identifies-tu tes tuples ?
Je pensais parcourir tout les champs d'une base et les comparait avec l'autre base
En ce cas, tu ne détecteras pas les mises à jour qui ont été effectuées sur les tuples.
that's it's a problem...
Je veux dire : si tu n'identifies pas la clef primaire et que tu compares le tuple entier, jamais tu ne repèreras les modifications. Tout tuple ayant été modifié sera repéré comme nouvel enregistrement...
Si, en revanche, tu peux identifier la clef primaire (c'est ce que j'ai fait dans le script dont je t'ai parlé, par exemple), alors tu compareras les tuples en utilisant cet identifiant et ce sera du gâteau.
bah si les tuples ont une clé primaire identique dans les deux bases, sauf si c'est un tuple qui a été ajouté...Citation:
Envoyé par Kirkis
il faut que je synchronise la structure et les données je m'en sors pas là...
est-ce que le début est bon ?
Code:
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 <?php //compare les deux bases et renvoye une chaine contenant le dump de la base synchronisée function synchronisation($base,$base_compare){ $liste_tables_base = mysql_list_tables($base); $liste_tables_base_compare = mysql_list_tables($base_compare); //traitement des tables if(mysql_num_rows($liste_tables_base) != mysql_num_rows($liste_tables_base_compare)){ //si il n'y a pas le meme nombre de tables dans les deux bases je parcours la liste des tables et fait les mises a jour dans $base en n'oubliant pas de vérifier les champs } else{ //si il y en a le meme nombre je parcours les listes et vérifie que ce sont les memes for($i=0;$i<mysql_num_rows($liste_tables_base);$i++){ for($j=0;$j<mysql_num_rows($liste_tables_base_compare);$j++){ if(mysql_tablename($liste_tables_base, $i) == mysql_tablename($liste_tables_base_compare , $j)){ //si ce sont les memes je vérifie le nombre de colonne de chaque table //si c'est le meme nombre je vérifie que ce sont les memes //si c'est pas le meem nombre je parcours les deux listes et fait les mises à jour dans $base } else{ //si c'est pas les memes je fais les mises à jour dans $base } } } } } ?>
Comment puis je récupérer le nombre de champs d'une table ainsi que leur noms sachant que je connais le nom de la table ?
Code:
1
2
3
4
5
6
7
8
9
10 $result = mysql_query("SHOW COLUMNS FROM tatable"); //récupération du nom des champs while($row = mysql_fetch_array($result)) { $champ[] = $row['Field']; } //récupération nombre count($champ);
merci....
j'avance petit a petit mais j'avance...
Un petit apercu, hésitez pas à la compléter ou donner votre avis
Code:
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53 <?php //compare les deux bases et renvoye une chaine contenant le dump de la base synchronisée function synchronisation($base,$base_compare){ $liste_tables_base = mysql_list_tables($base); $liste_tables_base_compare = mysql_list_tables($base_compare); //traitement des structure de tables if(mysql_num_rows($liste_tables_base) != mysql_num_rows($liste_tables_base_compare)){ //TODO si il n'y a pas le meme nombre de tables dans les deux bases je parcours la liste des tables et fait les mises a jour dans $base en n'oubliant pas de vérifier les champs } else{ //si il y en a le meme nombre je parcours les listes et vérifie que ce sont les memes noms de tables for($i=0;$i<mysql_num_rows($liste_tables_base);$i++){ for($j=0;$j<mysql_num_rows($liste_tables_base_compare);$j++){ if(mysql_tablename($liste_tables_base, $i) == mysql_tablename($liste_tables_base_compare , $j)){ //si ce sont les memes je vérifie le nombre de champs de chaque table //récupération du nom des champs $result_base = mysql_query('SHOW COLUMNS FROM '.mysql_tablename($liste_tables_base, $i) while($row = mysql_fetch_array($result_base)) { $champ_base[] = $row['Field']; } $result_base_compare = mysql_query('SHOW COLUMNS FROM '.mysql_tablename($liste_tables_base_compare, $j) while($row = mysql_fetch_array($result_base_compare)) { $champ_base_compare[] = $row['Field']; } if(count($champ_base) == count($champ_base_compare)){ //si c'est le meme nombre je vérifie que ce sont les memes champs for($k=0;$k<count($champ_base);$k++){ for($l=0;$l<count($champ_base_compare);$l++){ if($champ[$k] != $champ[$l]){ //TODO les noms des champs sont différents donc je mets à jour $base } } } } else{ //TODO si c'est pas le meem nombre de champs je parcours les deux listes et fait les mises à jour dans $base } } else{ //TODO si c'est pas les memes noms de tables je fais les mises à jour dans $base } } } } //traitement des données des tables } ?>
allez c'est lundi, on s'y remet de bonne heure et de bonne humeur :)
Salut
Tu sais, il y a moyen de déterminer quels champs sont clef primaire d'une table, si tant est qu'il y ait une clef primaire. Dans le script dont je t'ai parlé plus haut, je me suis creusé la tête à déterminer quelle est la clef primaire même lorsqu'elle n'est pas définie.
Sans cette clef, je t'assure que tu vas rapidement avoir des incohérences.
J'ai deeja répondu a ta qustion, j'ai une clef primaire a chaque table ;)
pour l'instant je me bats avec la synchronisation de la structure...
Je voudrais vérifier que l'élément de la premiere liste est dans la deuxieme, si non je l'ajoute a la base si oui je passe au second élément de la premiere liste.
avec ce que j'ai fait j'ai un probleme je parcour toutes ma deuxieme liste avaant d'incrementer la premier donc evidemment a un moment je rentre dans le if et souleve une erreur car j'essaye d'ajouter une table qui existe déjà.
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14 for($i=0;$i<mysql_num_rows($liste_tables_base_compare);$i++){ for($j=0;$j<mysql_num_rows($liste_tables_base);$j++){ echo '<br> Table de base_compare : '.mysql_tablename($liste_tables_base_compare, $i); echo '<br> Table de base : '.mysql_tablename($liste_tables_base , $j); if(mysql_tablename($liste_tables_base_compare, $i) != mysql_tablename($liste_tables_base , $j)){ echo '<br>differentes<br>'; $create= mysql_query("SHOW CREATE TABLE ".mysql_tablename($liste_tables_base_compare, $i)) or die('ERREUR : '.mysql_error()); $tableau = mysql_fetch_array($create); $tableau[1] .= ";"; mysql_selectdb($base);//selectionne la base mysql_query($tableau[1]) or die('ERREUR 2 : '.mysql_error()); } } }
Probleme résolu
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24 liste_tables_base = mysql_list_tables($base); $liste_tables_base_compare = mysql_list_tables($base_compare); //traitement des structure de tables if(mysql_num_rows($liste_tables_base) != mysql_num_rows($liste_tables_base_compare)){ //si il n'y a pas le meme nombre de tables dans les deux bases je parcours la liste des tables et fait les mises a jour dans $base for($i=0;$i<mysql_num_rows($liste_tables_base_compare);$i++){ $egale = false; for($j=0;$j<mysql_num_rows($liste_tables_base);$j++){ if(mysql_tablename($liste_tables_base_compare, $i) == mysql_tablename($liste_tables_base , $j)){ $egale = true; break; } } if($egale == false){ mysql_selectdb($base_compare);//selectionne la base $create= mysql_query("SHOW CREATE TABLE ".mysql_tablename($liste_tables_base_compare, $i)) or die('<br>ERREUR : '.mysql_error()); $tableau = mysql_fetch_array($create); $tableau[1] .= ";"; mysql_selectdb($base);//selectionne la base mysql_query($tableau[1]) or die('<br>ERREUR 2 : '.mysql_error()); } }
Ah tiens, je t'avais mal compris ici :
J'avais compris "au cas où" et non "puisque"... Je suis parfois très borné :/Citation:
Envoyé par schlough
Si je puis me permettre un conseil : appelle mysql_num_rows() avant chaque boucles et enregistre chaque valeur dans une variable, car tu demandes actuellement à PHP de retrouver chaque valeur à chaque fois. Ce n'est pas très coûteux en temps d'exécution mais bon...
J'imagine qu'il ne te reste plus qu'à parcourir les tuples de chaque base et, à chacun d'eux, de comparer son existence dans l'une et l'autre table en utilisant la clef.
Bonne chance pour déterminer si un tuple a été mis à jour et nécessite une modification...
Voila j'ai un peu optimisé la fonction synchronisation.php faut que je la continue maintenant
Code:
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
40
41 <?php //compare les deux bases et renvoye une chaine contenant le dump de la base synchronisée //on choisit si on veut synchronisé la structure et si on veut synchroniser les données function synchronisation($base,$base_compare, $donnees = false,$structure = false){ $liste_tables_base = mysql_list_tables($base); $liste_tables_base_compare = mysql_list_tables($base_compare); if($structure == true){ //traitement des structure de tables //je prends l'élément de la premiere base et je regarde si il est dans la deuxième for($i=0;$i<mysql_num_rows($liste_tables_base);$i++){ $egale = false; for($j=0;$j<mysql_num_rows($liste_tables_base_compare);$j++){ if(mysql_tablename($liste_tables_base, $i) == mysql_tablename($liste_tables_base_compare, $j)){ $egale = true; break; } } if($egale == false){ //la table n'existe pas dans les deux bases, je la crée donc dans $base_compare mysql_selectdb($base);//selectionne la base $create= mysql_query("SHOW CREATE TABLE ".mysql_tablename($liste_tables_base, $i)) or die('<br>ERREUR : '.mysql_error()); $tableau = mysql_fetch_array($create); $tableau[1] .= ";"; mysql_selectdb($base_compare);//selectionne la base mysql_query($tableau[1]) or die('<br>ERREUR 2 : '.mysql_error()); } else{ //la table existe dans les deux bases, je vérifie si elle a la meme structure } } } if($structure == true){ //traitement des données de tables } } ?>
Pour l'instant je suis toujours dans les structures, il faut que quand une table existe dans les deux bases je vérifie si elle a la meme structure, je pense voir bien optimisé la non, qu'en penses tu ?Citation:
Envoyé par Kirkis
Je veux faire un truc qui tourne nickel sur les structures et apres je m'attaquerais aux données, mais je veux vraiment faire quelque chose de bien fait et réutilisable facilement.
Perso, j'aurais plutôt adopté un truc genre :
[/list:u:139dc044fd][*]parcours des tables de la BDD2
- parcours des tables de la BDD1
[list:139dc044fd]- recherche du nom de la table dans la BDD2
[list:139dc044fd]- si inexistant : créer puis insérer les données
- si existant : comparer la structure puis les tuples dans les 2 BDD
[/list:u:139dc044fd]
- comparer les tuples de la table dans les 2 BDD (les structures de tables sont déjà synchronisées)