IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

UNE date pour plusieurs dates et UN évènement pour plusieurs évènements... [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué Avatar de Aliosha
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 138
    Points
    138
    Par défaut UNE date pour plusieurs dates et UN évènement pour plusieurs évènements...
    Bonjour.
    C'est mon premier message, soyez indulgents !

    A partir d'une table Planning contenant des données telles que :

    date_elem nom_elem lieu_elem
    2006-11-15 / evenement1 / endroit1
    2006-11-16 / evenement1 / endroit1
    2006-11-17 / evenement1 / endroit2
    2006-12-07 / evenement1 / endroit2
    2006-12-08 / evenement1 / endroit2
    2006-12-09 / evenement1 / endroit2

    Je voudrais récupérer : d'abord, chaque mois contenant un évènement, et celui-ci regroupant tous les évènements (dans le cas présent : 2006-11 et 2006-12) ; puis, pour chaque mois, afficher la liste de tous les endroits où l'évènement1 s'est produit (dans le cas présent : en 2006-11 -> endroit1 et endroit2 ; en 2006-12 -> endroit2). Mais je ne veux les afficher qu'une fois... (Compliqué, moi ? bah ouais...)

    En gros je veux qu'à la fin, ça me donne ça :

    En 2006-11, l'évènement1 s'est déroulé à endroit1, endroit2.
    En 2006-12, l'évènement1 s'est déroule à endroit2.

    Pour cela, j'utilise heu... une succession de boucles (on va dire) imbriquées les unes dans les autres... Enfin, voici mon code.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    $requete2 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' ORDER BY date_elem ASC";
    // Je formule une requete pour récupérer toutes les
    //dates correspondant à evenement1
    $resultat2 = ExecRequete ($requete2,$connexion);
    // Là, dans le résultat, j'ai toutes les dates.
    // Il faut que j'arrive à grouper toutes les dates par mois. 
    // ex : Mars 2006, Octobre 2006
     
    // Je spécifie une variable $i, pour ma boucle.
    $i = '1';
     
    while ($planning = ObjetSuivant($resultat2)) { // Je crée une 
    // boucle « Tant qu'il y a un résultat associé à ma requête... »
     
        // On spécifie une variable fourre-tout qui contient 
        //toutes les dates en $dateplanning[$1] en $i++
          $dateplanning[$i] = $planning->date_elem;
          // On crée, à partir de chaque date, une date de type 
        // AAAA/MM/01, pour, plus tard, comparer deux dates
          $datemoisencours = substr($dateplanning[$i],'0','4')."-".substr($dateplanning[$i],'5','2')."-01";
          // Je récupère le mois en cours, pour créer une date
          // de type AAAA/MM+1/01
          $moisencours = substr($dateplanning[$i],'5','2');
          // Si le mois en cours est inférieur à dix, j'ajoute 0,
        // et j'obtiens ainsi le mois suivant.
          if ($moisencours < '10') {
              $moissuivant = $moisencours+'1';
              $moissuivant = "0$moissuivant";
          }
          else {
              $moissuivant = $moisencours+'1';
          }
          // Là j'ai la date du mois suivant.
          $datemoisuivant = substr($dateplanning[$i],'0','4')."-".$moissuivant."-01";
        // Si ce n'est pas la première entrée, je peux demander 
        //la création d'une variable donnant la date
        // en format AAAA-MM-JJ de l'entrée précédente.
        if ($i != '1') {
              $dateentreeprecedente = substr($dateplanning[$i-'1'],'0','4')."-".substr($dateplanning[$i-'1'],'5','2')."-01";
        }
        // Si c'est la première entrée, je mets en écho le mois (en 
        //une seule fois), puis je spécifie comme requête : Choisir 
        // tous les éléments de planning quand le nom de l'élément
        // est égal à l'évenement1 et que la date qui lui est associée 
        // se situe entre le premier du mois en cours et le premier du 
        // mois suivant. Dans cette requête, je spécifie une option GROUP BY
        // pour éviter les éventuels doublons.
        if ($i == '1') {
              $datefinale = DateSimpleFr($datemoisencours);
              echo "en <b>$datefinale</b> ";
              $requete3 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' AND date_elem>='$datemoisencours' AND date_elem<'$datemoisuivant' GROUP BY lieu_elem ORDER BY date_elem ASC";
              $resultat3 = ExecRequete($requete3,$connexion);
              while ($donnees3 = ObjetSuivant($resultat3))
            {
                  echo $donnees3->lieu_elem. ", ";
              }
          }
        // Si ce n'est pas la première entrée, et que le mois de la ligne
        // précédent n'est pas le même
        // Que le mois en cours, j'effectue la même requête.
          if ($i != '1' && $datemoisencours != $dateentreeprecedente)
        {
            $datefinale = DateSimpleFr($datemoisencours);
            echo "en <b>$datefinale (date$i)</b> ";
              $requete4 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' AND date_elem>='$datemoisencours' AND date_elem<'$datemoisuivant' GROUP BY lieu_elem ORDER BY date_elem ASC";
              $resultat4 = ExecRequete($requete4,$connexion);
              while ($donnees4 = ObjetSuivant($resultat4))
            {
             echo $donnees4->lieu_elem. ", ";
            }
          }
     
        // J'auto-ajoute $i
        $i++;
    }
    Je précise bien que, dans le futur, il y aura peut-être un mois où il n'y aura rien (voilà pourquoi je ne crée par de $datemoisprecedent, et plutôt une $dateentreeprecedente.

    Donc voilà.

    En local, cela fonctionne parfaitement. Cela m'affiche bien :

    En 2006-11, l'évènement1 s'est déroulé à endroit1, endroit2.
    En 2006-12, l'évènement1 s'est déroule à endroit2.

    Mais sur le site où je publie ce code, cela m'affiche :

    En 2006-11, l'évènement1 s'est déroulé à endroit1, endroit2.
    En 2006-12, l'évènement1 s'est déroule à.

    Et je ne comprends pas pourquoi.

    Quelqu'un peut-il m'aider ?

    Alex.
    « Le vécu-plat excite le chaos-rêve. » Traité de l'inactivité, Dimitri Grouchkch.

  2. #2
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    Hello ,

    une solution : tu classe tes enregistrements par date , au moment de l'affichage tu regarde si la date et l'evenement a deja ete affiché (donc l'enregistrement precedent) :

    - Si c'est le cas , tu ajoute "endroit2" a la chaine precedente qui sera "En 2006-11, l'évènement1 s'est déroulé à endroit1,"

    - Sinon tu cree une nouvelle chaine : "En 2006-12, l'évènement1 s'est déroule à endroit2."

    pour reprendre ton exemple ! Donc tout ceci dans une seule boucle !
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  3. #3
    Membre habitué Avatar de Aliosha
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 138
    Points
    138
    Par défaut
    Aheu... J'ai pas tout bien compris !
    « Le vécu-plat excite le chaos-rêve. » Traité de l'inactivité, Dimitri Grouchkch.

  4. #4
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    en gros :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    //requete classée par date
    $requete2 = "SELECT * FROM Planning WHERE nom_elem = 'evenement1' ORDER BY date_elem ASC";
     
    $precedent = "" ;
    $affichage="";
     
    while ($data = mysql_fetch_array($requete2)){
     
    if ($data[date] = $precedent)
      {
        $affichage .= ",".$data[endroit];
      }
    else
      {
        $affichage .= "<br>L'evenement du ".$data[date]." a eu lieu :   ".$data[endroit] ; 
      }
     
    $precedent = $data[date] ;}
    Le code n est pas testé et ne correspond pas aux vrai noms de tes champs , c est plus une technique que j essaie de te montrer !
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  5. #5
    Membre habitué Avatar de Aliosha
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 138
    Points
    138
    Par défaut
    Ah oui !
    Je vois mieux.
    Bon je vais tester ça. Je te dis. Merci de ne pas me laisser désespérer ! :p
    « Le vécu-plat excite le chaos-rêve. » Traité de l'inactivité, Dimitri Grouchkch.

  6. #6
    Rédacteur
    Avatar de RideKick
    Homme Profil pro
    Directeur technique
    Inscrit en
    Septembre 2006
    Messages
    5 914
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Directeur technique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Septembre 2006
    Messages : 5 914
    Points : 12 572
    Points
    12 572
    Par défaut
    n'oublie pas a la fin de faire un

    lol , j'ai séparé le traitement et l'affichage on va eviter d'oublier la moitié du code ....
    Pas de questions techniques en MP please

    Mon site perso

    Mon profil Viadeo

  7. #7
    Membre habitué Avatar de Aliosha
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 138
    Points
    138
    Par défaut
    Ui ui ^^
    L'important est que tu m'aies filé une méthode qui m'évite d'avoir à définir des variables inutiles.
    « Le vécu-plat excite le chaos-rêve. » Traité de l'inactivité, Dimitri Grouchkch.

  8. #8
    Membre habitué Avatar de Aliosha
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 138
    Points
    138
    Par défaut
    Aheu... Je vais faire mon ch.. heu énervant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    while ($donnees = mysql_fetch_array($resultat2)) {
     
    			if ($donnees['date_elem'] = $precedent)
      			{
        			$affichage .= ",".$donnees['lieu_elem'];
      			}
      			else
      			{
        			$affichage .= "<br>".$donnees['date_elem']." ".$donnees['lieu_elem'] ;
    			}
    			$precedent = $donnees['date_elem'];
      		}
    		echo $affichage ;
    me renvoie simplement :

    evenement1
    evenement1
    evenement2
    evenement2
    evenement2
    evenement2
    evenement2

    Or moi je veux (déjà afficher la date, je me demande où elle est passée... puisque je la mets dans $affichage...) afficher une seule fois chaque évènement (pour un mois donné)...
    « Le vécu-plat excite le chaos-rêve. » Traité de l'inactivité, Dimitri Grouchkch.

  9. #9
    Membre habitué Avatar de Aliosha
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    124
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 124
    Points : 138
    Points
    138
    Par défaut
    Bon en fait, j'ai réussi !
    C'était le mois de décembre qui buguait. Quand je disais : chercher le mois suivant pour 12/2006, il me mettait 13/2006 par exemple. Du coup, plutôt que de chercher du 1/12/2006 au 1/01/2007 (par exemple), je ne cherche plus qu'au 31/12/2007...

    Voilà mon code pour les curieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    $dateentreeprecedente = "0000-00-00";
    		$i = "0";
    while ($planning = ObjetSuivant($resultat2)) {
     
    			// On spécifie une variable fourre-tout qui contient toutes les dates en $dateplanning[$1] en $i++
      			$dateplanning = $planning->dated_elem;
      			// On crée, à partir de chaque date, une date de type AAAA/MM/01, pour ensuite comparer deux dates
      			// On crée, à partir de chaque date, une date de type AAAA/MM/01, pour ensuite comparer deux dates
      			$datemoisencours = substr($dateplanning,'0','4')."-".substr($dateplanning,'5','2')."-01";
      			// Je récupère le mois en cours.
      			$moisencours = substr($dateplanning,'5','2');
      			$anneeencours = substr($dateplanning,'0','4');
      			$datefinmois = $anneeencours."-".$moisencours."-31";
      			// Si le mois en cours est inférieur à dix, j'ajoute 0, et j'obtiens ainsi le mois suivant.
      			if ($datemoisencours > $dateentreeprecedente)
    			{
    				$datefinale = DateSimpleFr($datemoisencours);
    				if ($i == '0') {
      				echo "en <b>$datefinale</b>";
      				}
      				else {
      				echo ", en <b>$datefinale</b> ";
      				}
      				$i++;
      				$requete4 = "SELECT * FROM Planning WHERE nom_elem = '$slash_nom_spect' AND dated_elem>='$datemoisencours' AND dated_elem<'$datefinmois' GROUP BY lieu_elem ORDER BY dated_elem ASC";
      				$resultat4 = ExecRequete($requete4,$connexion);
      				$j = "0";
      				while ($donnees4 = ObjetSuivant($resultat4))
    				{
    					if ($j == '0') {
      					echo " ".$donnees4->lieu_elem;
      					}
      					else {
    					echo ", ".$donnees4->lieu_elem;
      					}
      					$j++;
     
      				}
      				echo "";
     
      			}
      			$dateentreeprecedente = $datemoisencours;
      			$i++;
      		}
    Encore merci pour ton aide, RideKick, tu n'as pas résolu mon problème mais tu m'as donné une méthode intéressante :p
    Pis faut bien chercher un peu, de temps en temps !
    « Le vécu-plat excite le chaos-rêve. » Traité de l'inactivité, Dimitri Grouchkch.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2003] Plusieurs requetes pour une même période de date
    Par nathalie.de dans le forum Access
    Réponses: 4
    Dernier message: 18/04/2011, 14h15
  2. [XL-2007] couleur cellule date differente si date passee, ou date du jour
    Par chris09300 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 29/03/2011, 08h24
  3. [MySQL] Conversion de plusieurs dates dans une même table MySQL
    Par laetiheu dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 28/08/2007, 09h49
  4. selectionner plusieures dates pour plusieures personnes
    Par davidengalere dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 27/06/2007, 12h05
  5. [8.5] trier une liste en fonction de plusieurs dates
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 3
    Dernier message: 12/06/2007, 13h52

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo