Problème dans ma boucle

Bisevac
Invité n'ayant pas de compte PHPfrance

13 févr. 2009, 10:57

Bonjour,

J'ai un problème d'affichage dans mon tableau dû certainement à ma boucle, en effet dans celui-ci Dans ma première, ceux sont les salariés et dans une autre colonne colonne nombre de jours restant.

Quand je n'avais pas encore rentré de code pour inséré mes nombres de jours restants tout s'afficher normalement. Mais depuis, mes salariés sont afficher 2 fois chacun, et dans ma colonne jours restant, il ne me mets pour la 1ère ligne, le nombre jour restant en tête dans ma bdd, et dans ma 2nd ligne, le nombre de jours restant en seconde position et ceux pour chacun de mes salariés. Je pense que j'ai certainement une erreur dans ma boucle, mais je n'arrive pas à le voir.

Voici ma requête :

Code : Tout sélectionner

$resultat = mysql_query("SELECT * FROM personne, contrats_personnes where archives=0 ORDER BY NOM");
Ma boucle :

Code : Tout sélectionner

while($boucle = mysql_fetch_assoc($resultat)) { $renvoi=mysql_fetch_array($resultat); $rest=$renvoi['Jours_total']-$renvoi['Jours_utilises'];

Code : Tout sélectionner

?> <p> <tr> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"><b><center><?php echo $boucle["Nom"]; ?></center></font></div></td> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"><b><center><?php echo $boucle["Prenom"]; ?></center></font></div></td> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"><b><center><?php echo $boucle["Service"]; ?></center></font></div></td> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"><b><center><?php echo $rest;?></center></font></div></td> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"width="5%"><b><center><a href="fiche/fiche.php?index=<?php echo $boucle['Num_perso'];?>" title="Fiche"><center><img src="image/fiche.png" border=0></center></a></font></div></td> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"width="5%"><b><center><a href="modifier/modifier.php?index=<?php echo $boucle['Num_perso'];?>" title="Modifier"><center><img src="image/update.png" border=0></center></a></font></div></td> <td bgcolor="<?php echo($couleur); ?>" width="5%"><div id="font"><font color="<?php echo($couleur2); ?>"width="5%"><b><center><a href="archiver/insertarchives.php?index=<?php echo $boucle['Num_perso'] ;?>" onclick="return(confirm('Voulez-vous vraiment archiver cette personne ?'));" title="Archiver"><center><img src="image/archiver.png" border=0></center></a></font></div></td> <tr> <?php } ?>
Merci d'avance pour votre aide. :wink:

Eléphant du PHP | 145 Messages

13 févr. 2009, 11:43

Bonjour Bisevac,

Je ne comprend pas trop ta boucle,
Enfin, je ne comprend pas pourquoi tu fais ça :shock:

Pourquoi tu ne passe pas directement par un fetch_array?
while($renvoi = mysql_fetch_array($resultat))  
{
$rest=$renvoi['Jours_total']-$renvoi['Jours_utilises'];
}
Car tu fais ton query, jusque là c'est bon. Je n'ai jamais fais le test en utilisant ta méthode mais je me demande si avec 2 fetch d'un coup (même si un est array et l'autre assoc), le curseur avance peut être de deux occurences?

Ensuite j'ai remarqué dans ton code que tu utilise l'index de ton assoc comme identifiant pour tes salariés, n'as-tu pas de clé primaire dans ta table? Car ton assoc se base sur une requète qui tri par nom ASC. Donc tout sera changé si un nouveau employé est inséré au milieu ou alors si un employé est supprimé non?

J'espère pouvoir t'aider :)

PS : Je viens de regarder encore une fois ton message et quand je regarde ta requète, tu l'effectue sur 2 entités, mais tu ne fais aucun liaison entre les deux?

Code : Tout sélectionner

$resultat = mysql_query("SELECT * FROM personne, contrats_personnes where archives=0 ORDER BY NOM");
Du genre :

Code : Tout sélectionner

$resultat = mysql_query("SELECT * FROM personne, contrats_personnes WHERE personne.num_emp = contrats_personnes.num_emp AND archives=0 ORDER BY NOM");
Je pense qu'une grande partie de ton erreur peut venir de là :)

Albat90 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

Petit nouveau ! | 7 Messages

13 févr. 2009, 11:57

j'ai essayer de modifier array en assoc et ça ne change rien, en fait je ne saisis pas trop la différence entre les deux !

Ensuite j'ai essayé avec ta requête

Code : Tout sélectionner

$resultat = mysql_query("SELECT * FROM personne, contrats_personnes where personne.Num_perso=contrats_personnes.Num_perso AND archives=0 ORDER BY NOM");
Il ne me mets que 2 salariés sur les 4, ensuite dans la colonne jours restant, il me prends en compte que

Code : Tout sélectionner

$renvoi['Jours_total']
il a l'air de zappé la soustraction, en plus il ne s'agit pas des bons 'jours totals', ceux sont des 2 autres salariés.

Eléphant du PHP | 145 Messages

13 févr. 2009, 12:12

Tu peux mettre le modèle relationnel de ta base?
En gros, peux tu nous indiquer la structure de ta base :

personne (num_pers, nom_pers, prenom_pers, ... , clé_etrangère#)
contrats_personnes(clé_primaire, champ1, champ2, ..., clé_etragère#)

Je pense qu'on pourra t'aider d'avantage si l'on connais la structure de ta table :)

Albat90 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

Petit nouveau ! | 7 Messages

13 févr. 2009, 12:19

Voilà mon MLD

PERSONNE (Num_perso, Nom, Prenom, Datenaiss, Service, Archives)
CONTRATS (Numcontrat, Typecontrat)
CONTRATS_PERSONNES (Numcontrat_perso, Date_debutcontr, Date_fincontr, Affichage, Jours_utilises Nbrejours, #Num_perso, #Numcontrat)
TYPE_CONGES (Numtype_conges, Typeconges)
CONGES (Numconges, Date_debut, Date_fin, Heure, Numuti, Poste, Date_enr, journee, #Num_perso, #Numtype_conges)
SERVICE (Numservice, Typeservice, #Num_perso)

Eléphant du PHP | 145 Messages

13 févr. 2009, 12:40

Ok, merci pour ceci :)

Donc, si nous récapitulons, tu veux faire une liaison entre ton entité PERSONNE et CONTRATS_PERSONNES. Ensuite, tu veux afficher dans un tableau
| Nom | Prenom | Jours restant |
| Jean | Pierres | 52 |

Cependant, dans ton entité CONTRATS_PERSONNES, tu ne possède pas l'information jour_restant. Par contre tu possède Nbrejours et jours_utilises.

Donc je pense que ton code devrait ressembler à ceci :
$personne_sql = "SELECT P.Num_perso, Nom, Prenom, (Nbrejours - Jours_Utilises) as Nbrestant
FROM PERSONNE P, CONTRATS_PERSONNES C
WHERE P.Num_perso = C.Num_perso
AND Archive = 0
ORDER BY Nom ASC";
$personne_query = mysql_query($personne_sql) or die (mysql_error());

echo '<table>
                <tr>
                    <td>Nom</td>
                    <td>Prenom</td>
                    <td>Jour restant</td>
                </tr>';
While($personne = mysql_fetch_array($personne_query)){
echo '<tr>
            <td>'.$personne['Nom'].'</td>
            <td>'.$personne['Prenom'].'</td>
            <td>'.$personne['Nbrestant'].'</td>
        </tr>';
}
echo '</table>';
Voila, cependant fais attention, il semblerait qu'il y a des redondance d'information dans ta base :)

Tiens nous au courant :)

Albat90 ;)
La culture, c'est comme la confiture, moins on en a, plus on l'étale.

Petit nouveau ! | 7 Messages

13 févr. 2009, 15:07

Merci ça fonctionne niquel ! :wink:

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

13 févr. 2009, 15:26

Modération :
Puisque ta question est résolue, j'ajoute le tag [Résolu]
pour indiquer aux personnes qui voudront consulter ce sujet qu'il contient une solution.

Tu peux réaliser cette opération toi-même
en cliquant sur le bouton Image qui s'affiche en haut à gauche de ce sujet
si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)

Petit nouveau ! | 7 Messages

13 févr. 2009, 15:33

Désolé d'avoir oublié de mettre le [Resolu], prochaine je tacherais de le mettre, pareil j'ai oublié que l'on été déconnecté au bout de x minutes d'inactivité c'est pour celà que mon dernier message été posté en tant qu'invité :wink:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

13 févr. 2009, 15:41

Lorsque tu avais posté ton premier message, tu étais connecté en tant qu'invité.
Tu ne peux donc le marquer [Résolu]. ;)