[RESOLU] faire une correspondance entre 2 dates

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] faire une correspondance entre 2 dates

Re: faire une correspondance entre 2 dates

par blinz » 18 juin 2014, 20:17

Je met ce sujet en résolu meme si il ne l'est pas car je souhaite faire plus simple.
j'ouvre un sujet similaire de ce fait

Re: faire une correspondance entre 2 dates

par xTG » 18 juin 2014, 20:04

Soit l'array suivant :

Code : Tout sélectionner

Array( [0] => Array( [1] => "texte" ))
Pour y accéder de façon à traiter x entrées (même si mon exemple n'en possède qu'une) :
foreach($array as $cle1 => $val)
{
  echo $clé1; // 0
  echo $val; // Array
  var_dump($val); // Array([1] => "texte")
  
  foreach($val as $cle2 => $val2)
  {
    echo $cle2; // 1
    echo $val; // texte
  }
}

Re: faire une correspondance entre 2 dates

par blinz » 18 juin 2014, 18:43

comment procéder à cela et surtout ou placer le code je vous prie

C'est normal que ça m'affiche 37 par exemple car ceci correspond à l'id de la sortie dans mon cas id_loisirs

que je récupère ainsi:
$r[strtotime($d->date_debut_sortie)][$d->id_loisirs] = $d->titre;

Re: faire une correspondance entre 2 dates

par xTG » 18 juin 2014, 18:20

Tes echo doivent afficher Array.
Car tu as :
[37] => Le balsamique
Fais donc un autre foreach pour parcourir les id_loisirs et tu auras accès aux titres.
:roll:

Re: faire une correspondance entre 2 dates

par blinz » 18 juin 2014, 17:19

Donc voilà j'ai fait en sorte de récupèrer le timestamp de la date de l'événement avec le code ci dessous:
Surtout avec:
$r[strtotime($d->date_debut_sortie)][$d->id_loisirs] = $d->titre;
Page date.php
<?php
class Date{

    var $days       = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi','Dimanche');
    var $months     = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    function getEvents($year){
        global $bdd;
       $req = $bdd->query("SELECT id_loisirs,titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid']." AND YEAR(date_debut_sortie)=".$year);
	

        $r = array();
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
	    print_r($d);
		   $r[strtotime($d->date_debut_sortie)][$d->id_loisirs] = $d->titre;
		   
        }

        return $r;
	   
    }
	
	

    function getAll($year){
        $r = array();
        
        $date = new DateTime($year.'-01-01');
        while($date->format('Y') <= $year){
            // Ce que je veux => $r[ANEEE][MOIS][JOUR] = JOUR DE LA SEMAINE
            $y = $date->format('Y');
            $m = $date->format('n');
            $d = $date->format('j');
            $w = str_replace('0','7',$date->format('w'));
            $r[$y][$m][$d] = $w;
            $date->add(new DateInterval('P1D'));
        }
        return $r; 
    }

}
Donc le renvoi de ça nous donne:
Page mon_profil.php
  <?php
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $events = $date->getEvents($year);
        $dates = $date->getAll($year);
        ?>
        <div class="periods">
            <div class="year"><?php echo $year; ?></div>
            <div class="months">
                <ul>
                    <?php foreach ($date->months as $id=>$m): ?>
                         <li><a href="#" id="linkMonth<?php echo $id+1; ?>"><?php echo utf8_encode(substr(utf8_decode($m),0,3)); ?></a></li>
                    <?php endforeach; ?>
                </ul>
            </div>
            <div class="clear"></div>
            <?php $dates = current($dates); ?>
            <?php foreach ($dates as $m=>$days): ?>
               <div class="month relative" id="month<?php echo $m; ?>">
               <table>
                   <thead>
                       <tr>
                           <?php foreach ($date->days as $d): ?>
                                <th><?php echo substr($d,0,3); ?></th>
                           <?php endforeach; ?>
                       </tr>
                   </thead>
                   <tbody>
                       <tr>
                       <?php $end = end($days); foreach($days as $d=>$w): ?>
                           <?php $time = strtotime("$year-$m-$d"); ?>
                           <?php if($d == 1 && $w != 1): ?>
                                <td colspan="<?php echo $w-1; ?>" class="padding"></td>
                           <?php endif; ?>
                           <td<?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                                <div class="relative">
                                    <div class="day"><?php echo $d; ?></div>
                                </div>
                               <div class="daytitle">
                                   <?php echo $date->days[$w-1]; ?> <?php echo $d; ?>  <?php echo $date->months[$m-1]; ?>
                               </div>
                               <ul class="events">
                                   <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif;  ?>
                               </ul>
                           </td>
                           <?php if($w == 7): ?>
                            </tr><tr>
                           <?php endif; ?>
                       <?php endforeach; ?>
                       <?php if($end != 7): ?>
                            <td colspan="<?php echo 7-$end; ?>" class="padding"></td>
                       <?php endif; ?>
                       </tr>
                   </tbody>
               </table>
               </div>
            <?php endforeach; ?>
        </div>
        <div class="clear"></div>
        <pre><?php print_r($events); ?></pre>
        
Ceci
  <pre><?php print_r($events); ?></pre>
nous donne l'array suivant:
Array
(
[1402718400] => Array
(
[37] => Le balsamique
)

[1402034400] => Array
(
[40] => La bastille
)

[1404007200] => Array
(
[42] => le savoyard
)

)

On a donc bien le timestamp de la date de l'évenement et le titre. ( j'aimerais rajouter la date_debut_sortie) mais je sais pas comment faire

Dans ma page profil.php

Ce code doit me permettre d'afficher l'événement au hover de la date sur le calendrier:
<ul class="events">
                                   <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif;  ?>
                               </ul>
Mais les balise <li>....</li> sont absente de mon code source...
Comment résoudre le tout svp, merci

Re: faire une correspondance entre 2 dates

par xTG » 18 juin 2014, 13:30

Tes echo doivent afficher Array.
Car tu as :
[37] => Le balsamique
Fais donc un autre foreach pour parcourir les id_loisirs et tu auras accès aux titres.

Re: faire une correspondance entre 2 dates

par blinz » 18 juin 2014, 12:59

J'ai bien avancé cependant au hover de la date du calendrier je n'arrive pas afficher le titre d'une sortie. ( j'y suis presque )

J'ai réussi à intégrer mon deuxième WHERE au sein de ma requete ce qui nous donne:
$req = $bdd->query("SELECT id_loisirs,titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid']." AND YEAR(date_debut_sortie)=".$year);
Donc voici la page date.php compléte:
<?php
class Date{

    var $days       = array('Lundi', 'Mardi', 'Mercredi', 'Jeudi', 'Vendredi', 'Samedi','Dimanche');
    var $months     = array('Janvier', 'Février', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet', 'Août', 'Septembre', 'Octobre', 'Novembre', 'Décembre');

    function getEvents($year){
        global $bdd;
       $req = $bdd->query("SELECT id_loisirs,titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid']." AND YEAR(date_debut_sortie)=".$year);
		

        $r = array();
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
	    print_r($d);
		   $r[strtotime($d->date_debut_sortie)][$d->id_loisirs] = $d->titre;
		   
        }

        return $r;
	   
    }
	
	

    function getAll($year){
        $r = array();
        
        $date = new DateTime($year.'-01-01');
        while($date->format('Y') <= $year){
            // Ce que je veux => $r[ANEEE][MOIS][JOUR] = JOUR DE LA SEMAINE
            $y = $date->format('Y');
            $m = $date->format('n');
            $d = $date->format('j');
            $w = str_replace('0','7',$date->format('w'));
            $r[$y][$m][$d] = $w;
            $date->add(new DateInterval('P1D'));
        }
        return $r; 
    }

}
Et la page mon_profil:
  <?php
        require('date.php');
        $date = new Date();
        $year = date('Y');
        $events = $date->getEvents($year);
        $dates = $date->getAll($year);
        ?>
        <div class="periods">
            <div class="year"><?php echo $year; ?></div>
            <div class="months">
                <ul>
                    <?php foreach ($date->months as $id=>$m): ?>
                         <li><a href="#" id="linkMonth<?php echo $id+1; ?>"><?php echo utf8_encode(substr(utf8_decode($m),0,3)); ?></a></li>
                    <?php endforeach; ?>
                </ul>
            </div>
            <div class="clear"></div>
            <?php $dates = current($dates); ?>
            <?php foreach ($dates as $m=>$days): ?>
               <div class="month relative" id="month<?php echo $m; ?>">
               <table>
                   <thead>
                       <tr>
                           <?php foreach ($date->days as $d): ?>
                                <th><?php echo substr($d,0,3); ?></th>
                           <?php endforeach; ?>
                       </tr>
                   </thead>
                   <tbody>
                       <tr>
                       <?php $end = end($days); foreach($days as $d=>$w): ?>
                           <?php $time = strtotime("$year-$m-$d"); ?>
                           <?php if($d == 1 && $w != 1): ?>
                                <td colspan="<?php echo $w-1; ?>" class="padding"></td>
                           <?php endif; ?>
                           <td<?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                                <div class="relative">
                                    <div class="day"><?php echo $d; ?></div>
                                </div>
                               <div class="daytitle">
                                   <?php echo $date->days[$w-1]; ?> <?php echo $d; ?>  <?php echo $date->months[$m-1]; ?>
                               </div>
                               <ul class="events">
                                   <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif;  ?>
                               </ul>
                           </td>
                           <?php if($w == 7): ?>
                            </tr><tr>
                           <?php endif; ?>
                       <?php endforeach; ?>
                       <?php if($end != 7): ?>
                            <td colspan="<?php echo 7-$end; ?>" class="padding"></td>
                       <?php endif; ?>
                       </tr>
                   </tbody>
               </table>
               </div>
            <?php endforeach; ?>
        </div>
        <div class="clear"></div>
        <pre><?php print_r($events); ?></pre>
        
Dans mon array on récupere bien notre requete:
Array
(
[1402718400] => Array
(
[37] => Le balsamique
)

[1402034400] => Array
(
[40] => La bastille
)

[1404007200] => Array
(
[42] => le savoyard
)

)

Re: faire une correspondance entre 2 dates

par blinz » 18 juin 2014, 10:20

Bonjour je viens de constater effectivement que la mes balise <li></li> était manquantes ....
donc ne figure pas
 <li><?php echo $e; ?></li>
A quoi cela peut être du svp ?

Ma requete actuelle:
$req = $bdd->query("SELECT titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid']);
 $req = $DB->query(' ma req actuelle ...   WHERE YEAR(date)='.$year);
Je ne vois pas comment intégrér le bout de code avec WHERE YEAR(date)='.$year);

Merci pour vos lumières :wink:

Re: faire une correspondance entre 2 dates

par xTG » 18 juin 2014, 08:33

Dans ton navigateur :
Clic droit > afficher le code source

Et vérifies qu'il y a bien des <li> avec tes events.

Re: faire une correspondance entre 2 dates

par blinz » 17 juin 2014, 20:28

Enfait j'ai fait ceci mais en fait je m'étais à jour la mauvaise page sur filezilla d'ou le fait que ça ne changait rien :)
function getEvents($year){
        global $bdd;
        $req = $bdd->query("SELECT titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid']);
        $r = array();
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
	    print_r($d);
		   $r[strtotime($d->date_debut_sortie)][$d->id_type_loisirs] = $d->titre;
		   
        }

        return $r;
	   
    }
Ce bout de code me renvoi bien:
Array
(
[1402718400] => Array
(
[] => Le balsamique
)

[1402034400] => Array
(
[] => La bastille
)

[1404007200] => Array
(
[] => le savoyard
)

)

Mais avec de bout de code devrait s'afficher l'événement ( titre ) au hover de la date sur mon calendrier, cependant je n'ai rient ?????? comme cet exemple: http://www.grafikart.fr/demo/PHP/calendar/index.html

A la ligne 2 de ce code je récupère le timestamp du jour
 <?php $end = end($days); foreach($days as $d=>$w): ?>

                           // TIMESTAMP DU JOUR
                           <?php $time = strtotime("$year-$m-$d"); ?>

                           <?php if($d == 1 && $w != 1): ?>
                                <td colspan="<?php echo $w-1; ?>" class="padding"></td>
                           <?php endif; ?>
                           <td<?php if($time == strtotime(date('Y-m-d'))): ?> class="today" <?php endif; ?>>
                                <div class="relative">
                                    <div class="day"><?php echo $d; ?></div>
                                </div>
                               <div class="daytitle">
                                   <?php echo $date->days[$w-1]; ?> <?php echo $d; ?>  <?php echo $date->months[$m-1]; ?>
                               </div>
                               
                               <ul class="events">
                                  // On récupere le tableau si il y en a un et dans mon cas il y en a un :) ( normalement) .
                                   <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif;  ?></ul>
Ou alors un problème dans le requete ?
 $req = $bdd->query("SELECT titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid'] );

Re: faire une correspondance entre 2 dates

par xTG » 17 juin 2014, 20:24

Bah en mettant un champ qui existe ! :lol:
$d->date n'existe pas.
SELECT titre,date_debut_sortie FROM

Re: faire une correspondance entre 2 dates

par blinz » 17 juin 2014, 19:01

Merci j'ai la logique je pense, mais je n'arrive pas à l'appliquer c'est ça le hic :)
Je pense bien que le problème vient de la:
$r[strtotime($d->date)][$d->id_type_loisirs] = $d->date_debut_sortie;
Mais comment le corrigé je vous prie ?

Re: faire une correspondance entre 2 dates

par xTG » 17 juin 2014, 18:57

1/ je n'avais pas vu cette ligne de code :
$events = $date->getEvents($year);
;)

2/ j'imaginais une date de fin vu que tu nommais date_debut, mon esprit a extrapolé.

3/ tu as donc juste à faire correspondre ta date, la boucle que tu as fait est bonne.
C'est juste que $time n'est pas correctement formaté et donc ça ne matche rien.
Tu peux la formater à ta guise avec la fonction date().

4/
$r[strtotime($d->date)][$d->id_type_loisirs] = $d->date_debut_sortie;
Tu n'as pas de champs nommé date, ton affectation ne fonctionne donc pas car c'est toujours remplacé par la valeur 0 en plus de te générer un warning.
Cela va mettre en échec ta boucle pour afficher les évènements, car toute date sera 0.

Re: faire une correspondance entre 2 dates

par blinz » 17 juin 2014, 18:23

excusez moi mais je suis un peu perdu de + je vois que vous mettez date_fin.
je ne récupère que le titre et la date_debut dans ma requete.
Voilà ce que j'ai essayé mais ça ne marche pas:
<ul class="events">
                                   <?php if(isset($events[$time])): foreach($events[$time] as $e): ?>
                                        <li><?php echo $e; ?></li>
                                   <?php endforeach; endif;  ?>
                               </ul>
Lorsque vous disez de "Stockes le retour de la fonction dans une variable avant le calendrier."
En faisant ceçi je né récupére pas ma fonction event dans la variable $r ?
  function getEvents($year){
        global $bdd;
        $req = $bdd->query("SELECT titre,date_debut_sortie FROM favoris f LEFT JOIN simply_user su ON f.`id_simply_user` = su.`id_simply_user` LEFT JOIN loisirs l ON f.`id_loisir` = l.`id_loisirs` WHERE su.`id_simply_user` =".$_SESSION['userid']);
        $r = array();
        /**
         * Ce que je veux $r[TIMESTAMP][id] = title
         */
        while($d = $req->fetch(PDO::FETCH_OBJ)){
	    print_r($d);
		   $r[strtotime($d->date)][$d->id_type_loisirs] = $d->date_debut_sortie;
        }

        return $r;
	   
    }


En faisant ceci, je récupère bien dans l'array l'évent:[/b]
 <pre><?php print_r($events); ?></pre>
Array
(
[0] => Array
(
[] => 2014-06-29 04:00:00
)

)


En faisant ceci, je stock bien ma requete au sein d'une variable nan ?

Un exemple serait il possible je vous prie ?
Cordialement

Re: faire une correspondance entre 2 dates

par xTG » 17 juin 2014, 18:00

Tu as $time qui est la date du jour.
Tu as ta fonction qui retourne les events.
Stockes le retour de la fonction dans une variable avant le calendrier.
Puis dans le code tu fais juste un parcours de cet array et tu compares les dates.

Code : Tout sélectionner

Date_debut <= $time && Date_fin <= $time