Pb de boucles for et while

tontoclic Messages postés 3 Date d'inscription samedi 1 mars 2003 Statut Membre Dernière intervention 29 mars 2008 - 28 mars 2008 à 18:00
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 - 29 mars 2008 à 13:23
Bonjour,

Je développe un site en PHP-MySQL pour site de numérisation et SIG (Systèmes d'Information Géographiques)
J'ai un pb d'affichage des données dans plusieurs tables dont voici les structures :

Liste de la structure des tables

PRESTATION (id_prestation, nom_prestation); -> 2 choix possibles : En numérisation et En SIG
DEPARTEMENT (id_dep, nom_dep);
REFERENCE (id_ref, client_ref, nom_ref, ville_ref, logo_ref, site_ref, id_dep, id_prestation);

Ce que je veux faire :

Afficher toutes les références par prestations et par départements :

En gros ça doit me donner ceci :

En numérisation
        Haute-Loire (43)
liste de toutes les références de la prestation numérisation du département de la Haute-Loire (43)

En SIG
       Cantal (15)
liste de toutes références de la prestation SIG du département du Cantal (15)
....

Ma logique est la suivante : Compter le nombre de lignes dans les tables DEPARTEMENT et PRESTATION puis parcourir ces deux tables pour en extraire les bonnes références par rapport au bon type de prestation et au bon département.
Le pb c que je ne sais pas mon code buggue au niveau des boucles for ou de mes boucles while imbriquées ou encore dans mes requêtes.

J'ai du mal dans la logique des boucles imbriquées for et while  en PHP, voici mon code:

<form action="" method="post" enctype="multipart/form-data" name="form1" id="form1">
  ----

//En-tetes
    Clients,
    Types de prestations,
    Action 1,
    Action 2,
 
  ----

        <?
              
    $parcours_dep = "SELECT COUNT(id_dep) as nbdep FROM departement";
    $res_dep =     mysql_query($parcours_dep);
    $i = 1;
    $j = 1;
    for ($i=1; $i<$res_dep; $i++)
    {
        $sql = "SELECT * FROM reference as REF, departement as DEP, prestation as P               WHERE REF.id_dep DEP.id_dep AND REF.id_prestation P.id_prestation
               AND DEP.id_dep = '".$i."'
               GROUP BY P.nom_prestation, DEP.nom_dep, REF.id_ref  ";
              
        $res = mysql_query($sql);
        $row = mysql_fetch_assoc($res);
       
        $parcours_prest = "SELECT COUNT(id_prestation) as nbprest FROM prestation";
        $res_prest = mysql_query($parcours_prest);
       
        for ($j=1; $j<$res_prest; $j++)
        {
            $sql2 = "SELECT * FROM reference as REF, departement as DEP, prestation as P               WHERE REF.id_dep DEP.id_dep AND REF.id_prestation P.id_prestation
               AND P.id_prestation = '".$j."'
               GROUP BY P.nom_prestation, DEP.nom_dep, REF.id_ref  ";
           
        $res2 = mysql_query($sql2);
        $row2 = mysql_fetch_assoc($res2);
       
        echo''.$row2["nom_prestation"].'

'; echo "   ";
        echo ''.$row["nom_dep"].'

';
       
        while ($row = mysql_fetch_assoc($res))
                {

                while ($row2 = mysql_fetch_assoc($res2))
                {
        ?>
      ,
   

        ----

       
                   <? //echo ''.$row["nom_prestation"].'

'; ?>,
                <? //echo ''.$row["nom_dep"].'

'; ?>,
       
            ----

           
                  <? echo ''.$row["client_ref"].'

';?>,
                  <? echo ''.$row["nom_ref"].'

';?>,
                  <? echo ("[ajout_ref.php Ajouter une référence]

</form>

Ce code ne marche pas car il m'affiche des doublons
Pouvez-vous m'aider rapidement svp
Merci d'avance

5 réponses

neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
28 mars 2008 à 22:36
Salut,

$res_dep =     mysql_query($parcours_dep);

La fonction mysql_query() retourne un ressource 'mysql result', exploitable par les fonctions qui extraient les résultats des ressources : mysql_fetch_*() et mysql_result(). Il FAUT obligatoirement utiliser l'une de ces fonctions pour connaitre les valeurs retournées par la requête.

$res_dep = mysql_query($parcours_dep);
$nb_dep = mysql_result($res_dep, 0, 'nbdep');

La variable $nb_dep contient désormais le résultat de COUNT(id_dep) de la requête.

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
tontoclic Messages postés 3 Date d'inscription samedi 1 mars 2003 Statut Membre Dernière intervention 29 mars 2008
29 mars 2008 à 09:12
Merci pour l'info neigedhiver en effet la fonction mysql_result retourne le nombre de lignes.

Mais ça ne résoud toujours pas mon pb!!

Merci pour suggestions.
0
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 mars 2008 à 09:58
Hello,

si j'ai bien compris ce que tu voulais faire, ton problème n'est pas un problème de boucles, mais de requête.
Non testé, mais cherche plutôt à faire ça en une seule requête comme ça :
SELECT
    presta.nom_prestation, dep.nom_dep, ref.client_ref
FROM
    reference ref
    INNER JOIN prestation presta ON presta.id_prestation = ref.id_prestation
    INNER JOIN departement dep ON dep.id_dep = ref.id_dep
ORDER BY
    presta.nom_prestation, dep.nom_dep, ref.client_ref
0
tontoclic Messages postés 3 Date d'inscription samedi 1 mars 2003 Statut Membre Dernière intervention 29 mars 2008
29 mars 2008 à 13:16
Ta requête marche bien mais ça me répète les prestations et nom de départements entre chaque référence :

Ex :

En numérisation  Allier (03)

Liste des références de la prest num et du dep allier

En numérisation Haute-Loire (43)

.....

En numérisation Haute-Loire (43)

....

Je ve que la prestation et le département s'affiche qu'une seule fois

comme ceci :

En numérisation Haute-Loire (43)
->Liste des références
En numérisation Allier (03)
->Liste des références
En SIG Puy-deDome
->Liste des références
.......

Pouvez-vous m'aider sur ce point! Merci
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
malalam Messages postés 10839 Date d'inscription lundi 24 février 2003 Statut Membre Dernière intervention 2 mars 2010 25
29 mars 2008 à 13:23
Ah ça après, c'est à toi de contrôler ce que tu affiches. Tu ne peux pas le faire en sql.
$sNomPresta = '';
while (parcours requête)
if ($sNomPresta === resultatParcoursRequêteDeNomDep) alors ne pas répêter le département mais afficher les prestations
0
Rejoignez-nous