[RESOLU] while (mysql_sql_fetch_array) imbriqués

while (mysql_sql_fetch_array) imbriqués [RESOLU] - PHP - Programmation

Marsh Posté le 15-02-2006 à 14:26:52    

Salut à tous!!
 
je vous explique mon problème.  
Grace à l'aide de Peter45 et Omega2, j'ai réussi à mettre en place un système de comparaison de données historisées.
cette partie fonctionne correctement, à savoir :  
j'ai une série de données accumulée sur un identifiant (nom prénom adresse et date d'intégration) avec un autoincrément en rab.
le système me compare ligne après ligne de la plus récente à la plus ancienne, les différences entre les lignes.
(exemple : identifiant abcd :  cette personne a changé de nom le 25-10-2004, ancien nom dupont, nouveau nom grobert.)
 
vous verrez le code y est..
le seul truc dans ce script, il ne me compare que les identifiants pour lesquels il existent au moins deux lignes dans l'historique.
 
pour ceux qui n'ont qu'une ligne (donc pas de modification visible dans la table historique) je veux les comparer avec une autre table qui comporte les mêmes champs de données (excepté l'autoincrément), qui correspondent à l'état actuel au temps t0.
dans la table historisation (t0) l'identifiant est unique.
le temps t1 correspond au champs le plus récent dans ma table historique.
je sais pas si vous me suivez, mais je préfère expliquer ce que je veux faire!  
 
bon passons dans le vif : mon code :  

Code :
  1. <?
  2. mysql_connect("localhost", "root", "" );
  3. mysql_select_db("bddessai2" );
  4. $identifiant='abcd';
  5. //selctionne tout de la table historique ou identifiant est celui envoyé en rangeant les resultats par date la plus recente à la plus ancienne
  6. $requete = "SELECT * FROM tablehistorique where identifiant='$identifiant' ORDER BY `date` DESC";
  7. $resultat = @mysql_query($requete);
  8. //selectionne tout dans la table historisation pour l'identifiant voulu (ici abcd)
  9. $requete1 = mysql_query ('SELECT * FROM tablehistorisation where identifiant="'.$identifiant.'"');
  10. $i=0;
  11. //si le nombre de ligne selectionnees est = à 1 (c'est à dire qu'une personne possède un historique récent sans modif
  12. if (@mysql_numrows($resultat)==1){//if1
  13. //tant que le tableau n'est pas entièrement parcouru pour les résultats de la table historisation
  14. while ($aff1 = mysql_fetch_array($requete1) {//while1
  15. //tant que le tableau n'est pas entièrement parcouru pour les résultats de la table historique
  16. while ($aff= mysql_fetch_array($resultat){//while2
  17. //si le nom pour l'identifiant donné dans la table historisation est différent de celui du dernier en date de la table historique  
  18. if ($aff1['nom']!=$aff['nom'] AND $i==0)
  19. //affiche moi que le nom a changé pour l'idenifiant choisi  
  20. {//if2
  21. //test avec juste le nom pour voir
  22. echo "<br> Identifiant =".$identifiant." - cette personne a changé de nom le ".$aff1['DateIntegr'];
  23. echo "<br> ancien nom : ".$aff['nom']."<br> nom actuel (dans la table historisation) :".$aff1['nom'];
  24. }//if2
  25. }//while2
  26. }//while1
  27. }//if1
  28. //code ok Peter45 modifié  
  29. //si le nombre de ligne selectionnees est supérieur à 1 (c'est à dire qu'une personne possède un historique  
  30. elseif(@mysql_numrows($resultat)>1){//1
  31. //on part de la première ligne la dernière date
  32. //parcoure moi le tableau des resultats et tant qu'on est  pas au bout :  
  33. while($aff = mysql_fetch_array($resultat)){//while
  34. // si on est sur une autre  ligne que la première   
  35. if ($i ==0){//0  première ligne de résultats, c'est la plus récente
  36. //la variable nom actuel est égale à celle qui contient le nom de la première ligne, de la seconde etc jusqu'à la fin du tableau  
  37. $nom_actuel = $aff["nom"];
  38. //idem pour le prenom
  39. $prenom_actuel = $aff["prenom"];
  40. //idem pour l'adresse actuelle
  41. $adresse_actuelle = $aff["adresse"];
  42. //idem pour la date
  43. $date_changement = $aff["date"];
  44. }//0
  45. //si le nom dans une ligne du tableau est différent du dernier nom (premiere ligne en l'occurence ici)
  46. if ($aff["nom"] != $nom_actuel){//2
  47. echo "<br> identifiant= ".$identifiant." - cette personne a changé de nom le ".$date_changement;
  48. echo "<br> ancien nom : ".$aff["nom"]."<br>nouveau nom : ".$nom_actuel."<br>";
  49. //permet de ne pas afficher les changements de nom plus anciens
  50. }//2
  51. //si le prenom dans une ligne du tableau est différent du dernier prenom (premiere ligne en l'occurence ici)
  52. if ($aff["prenom"] != $prenom_actuel){//3
  53. echo "<br> identifiant= ".$identifiant." - cette personne a changé de prénom le ".$date_changement;
  54. echo "<br> ancien prénom : ".$aff["prenom"]."<br>nouveau prénom : ".$prenom_actuel."<br>";
  55. //permet de ne pas afficher les changements de prénom plus anciens
  56. }//3
  57. //si l'adresse dans une ligne du tableau est différent de la dernière adresse (premiere ligne en l'occurence ici)
  58. if ($aff["adresse"] != $adresse_actuelle){//4
  59. echo "<br> identifiant= ".$identifiant." - cette personne a changé d'adresse le ".$date_changement;
  60. echo "<br> ancienne adresse : ".$aff["adresse"]."<br>nouvelle adresse : ".$adresse_actuelle."<br>";
  61. //permet de ne pas afficher les changements d'adresse plus anciens
  62. }//4
  63. if ($i !=0){//0  première ligne de résultats, c'est la plus récente
  64. //la variable nom actuel est égale à celle qui contient le nom de la première ligne, de la seconde etc jusqu'à la fin du tableau  
  65. $nom_actuel = $aff["nom"];
  66. //idem pour le prenom
  67. $prenom_actuel = $aff["prenom"];
  68. //idem pour l'adresse actuelle
  69. $adresse_actuelle = $aff["adresse"];
  70. //idem pour la date
  71. $date_changement = $aff["date"];
  72. //si le nom dans une ligne du tableau est différent du dernier nom (premiere ligne en l'occurence ici)
  73. if ($aff["nom"] != $nom_actuel){//2
  74. echo "<br> identifiant= ".$identifiant." - cette personne a changé de nom le ".$date_changement;
  75. echo "<br> ancien nom : ".$aff["nom"]."<br>nouveau nom : ".$nom_actuel."<br>";
  76. //permet de ne pas afficher les changements de nom plus anciens
  77. }//2
  78. //si le prenom dans une ligne du tableau est différent du dernier prenom (premiere ligne en l'occurence ici)
  79. if ($aff["prenom"] != $prenom_actuel){//3
  80. echo "<br /> identifiant= ".$identifiant." - cette personne a changé de prénom le ".$date_changement;
  81. echo "<br> ancien prénom : ".$aff["prenom"]."<br>nouveau prénom : ".$prenom_actuel."<br>";
  82. //permet de ne pas afficher les changements de prénom plus anciens
  83. }//3
  84. //si l'adresse dans une ligne du tableau est différent de la dernière adresse (premiere ligne en l'occurence ici)
  85. if ($aff["adresse"] != $adresse_actuelle){//4
  86. echo "<br> identifiant= ".$identifiant." - cette personne a changé d'adresse le ".$date_changement;
  87. echo "<br> ancienne adresse : ".$aff["adresse"]."<br>nouvelle adresse : ".$adresse_actuelle."<br>";
  88. //permet de ne pas afficher les changements d'adresse plus anciens
  89. }//4
  90. }//0
  91. $i++;
  92. $nom_actuel = $aff["nom"];
  93. $prenom_actuel = $aff["prenom"];
  94. $adresse_actuelle = $aff["adresse"];
  95. $date_changement = $aff["date"];
  96. }//while
  97. }//1
  98. else {echo 'huh';}
  99. ?>


 
le résultat :  il me met parse error à la ligne 16...là où j'essaye de faire cette compararison de ligne de deux tables.
 
1- je vois pas l'erreur (souvent pour moi c'est une erreur causée par des quotes ou des oublis de ';' )
2- Je suis pas sur que ma méthode pour comparer une ligne de table avec une ligne d'une autre table soit la bonne...
a mon avis (j'ai testé sur d'autres cas) ma double boucle va me générer deux fois minimum ce que je veux, en plus du parse error...
 
quelqu'un peut me filer un coup de main? merchi!! :D


Message édité par flock86 le 15-02-2006 à 16:10:00
Reply

Marsh Posté le 15-02-2006 à 14:26:52   

Reply

Marsh Posté le 15-02-2006 à 14:32:02    

bin manque une parenthèse ligne 16 ... comme te le dit le message d'erreur

Code :
  1. while ($aff1 = mysql_fetch_array($requete1) ){


 
D'ailleurs ligne 18 aussi !!!
 
edit: grrr on peut pas mettre de gras dans une balise code...


Message édité par anapajari le 15-02-2006 à 14:33:27
Reply

Marsh Posté le 15-02-2006 à 14:34:11    

quelle connerie!!
merci! c'était sous mon nez!!
je teste...
 
ok!! ça marche, du moins en terme de syntaxe...
sinon mon résultat n'affiche pas ce dont j'ai besoin...
il ne faut pas que je compte si le nombre de lignes est égal à 1 : qu'il y en ait plusieurs ou pas j'ai toujours besoin de comparer la ligne la plus récente de la table historique avec la ligne unique pour l'identifiant dans l'autre table...
donc je vire le if 1, et ça ne change rien...
je dois avoir un problème de logique  :pfff:  
je suis pas doué !
merci pour la correction syntaxique en tous les cas anapajari!! (la honte :sweat: )
 
[edit] bon en fait il me compare la ligne de la atble historisation avec toutes les lignes de l'historique alors que je lui demande de comparer avec la plus récente seulement...et il ne tiens pas compte de la suite du code de Peter45...
grrr
 
il faudrait changer le code ligne 20 :  
if($aff1['nom']!=$aff['nom'] AND "la première ligne du tableau de $requete (table historique)" )
c'est une histoire d'array...
comment dire ça? ligne0 de l'array?  
je vais chercher dans cette direction...
et je trouve grace au $stop que des maîtres es php m'ont enseigné dans mon long périple...
 
mais pourquoi il ne continue pas après à lire la suite du code?!!! :??:
 
 
bon j'ai résolu mon problème avec un système d'includes...
j'ai séparé mes deux requetes comme ça et ça m'éxécute les 2...
merci pour votre ecoute!!
 ;)


Message édité par flock86 le 15-02-2006 à 16:36:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed