Récupérer des données sur un mois, array des jours occupés

Résolu
555clR Messages postés 36 Date d'inscription mardi 23 novembre 2010 Statut Membre Dernière intervention 4 avril 2013 - 22 nov. 2011 à 22:38
555clR Messages postés 36 Date d'inscription mardi 23 novembre 2010 Statut Membre Dernière intervention 4 avril 2013 - 24 nov. 2011 à 07:28
Bonsoir !

J'ai deux problèmes auxquels je ne trouve pas de solution :
1/ Le premier se trouve dans ma requête...
Je vous dresse le décor:
- Une table d'évènements avec (entre autres): dates de début(type datetime) et durées(type time)
L'idée serait de récupérer tous les évènements d'un mois :
ceux qui commencent et se finissent le mois en question, mais aussi ceux qui ont débuté le mois précédent et ceux qui se terminent le mois suivant.
J'ai fait cette requête mais elle ne fonctionne pas. Il n'y a pas d'erreur signalée mais elle ne me retourne aucun résultat, alors que des enregistrements sont présents dans la base. je pense avoir fait une erreur mais je ne sais pas où...

Voici mon code :
//Dbt du mois le matin à 00h00
$dbt_mois = 'date(\''.mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']).'\')';
//fin du mois le soir à 00h00
$fin_mois = 'date(DATE_ADD(date(DATE_ADD('.$dbt_mois.', INTERVAL 1 MONTH)), INTERVAL 1 DAY))';
//début evt
$dbt_evt = 'date(event_date_debut)';
//Fin evt
$fin_evt = 'DATE_ADD(event_date_debut,INTERVAL event_duree HOUR_SECOND)';
//condition où : fin evt après dbt du mois && début evt avt fin du mois
$where = '('.$fin_evt.' > '.$dbt_mois.') && ('.$dbt_evt.' <= '.$fin_mois.')';
$sql ='SELECT event_id,event_date_debut,event_duree
FROM evenements
WHERE '.$where.'
ORDER BY day(event_date_debut)';
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
while ($event = mysql_fetch_array($req))
{
$jourbusy[] = array(
'event_id' => $event['event_id'],
'event_date_debut' => $event['event_date_debut'],
'event_duree' => $event['event_duree']);
}
mysql_free_result ($req);

2/ Le second interviendra immédiatement ensuite : je ne vois pas comment faire pour ensuite récupérer les jours du mois occupés par un évènement? Comment lister ces jours ? Existe t-il une fonction ?

Merci d'avance, toutes les pistes seront les bienvenues.
Bonne soirée à tous

4 réponses

cs_47 Messages postés 197 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 20 février 2013 1
23 nov. 2011 à 15:11
Bonjour,

d'après la doc de mysql 5, on peut ajouter un time à un timestamp via la commande addtime lien

// on récupére le début et la fin du mois
$sDebutMois = date('Y-m-d H:i:s', mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']));

$sFinMois = date('Y-m-d H:i:s', mktime(0, 0, 0, $_GET['m']+1, 0, $_GET['y']));

$sWhere = "(event_date_debut >= '$sDebutMois' addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= '$sFinMois'";

$sSQL = 'select event_id, event_date_debut, event_duree '
    . 'FROM evenements '
    . 'WHERE ' . $sWhere;



bonne après midi
3
cs_47 Messages postés 197 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 20 février 2013 1
23 nov. 2011 à 15:13
erf et pas d'édition du message ...

j'ai oublié un or dans le where

$sWhere = "(event_date_debut >= '$sDebutMois' or addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= '$sFinMois'";
3
555clR Messages postés 36 Date d'inscription mardi 23 novembre 2010 Statut Membre Dernière intervention 4 avril 2013
24 nov. 2011 à 02:57
bonsoir et merci de ton aide... c'est en effet plus propre ainsi !!
en fait ça marche également comme je pensais, une erreur dans l'affichage du timestamp de début de mois :

//Dbt du mois le matin à 00h00
$dbt_mois = 'date(\''.$_GET['y'].'-'.$_GET['m'].'-01\')';

...pour la correction quand même, même si ta solution est plus "directe" (et donc plus propre). je valide !

Du coup reste quand même mon 2ème pb, obscur. Comment récupérer le numéro des jours occupés par un évènement (d'autant qu'on sait que certains peuvent se dérouler sur plusieurs jours ? )

Merci de vos contributions, pistes, idées... je ne vois pas bien comment m'y prendre, là...
0
555clR Messages postés 36 Date d'inscription mardi 23 novembre 2010 Statut Membre Dernière intervention 4 avril 2013
24 nov. 2011 à 07:28
J'ajoute juste ("erf, pas d'édition..."):
la fin du mois correspond au dernier jour du mois à 00h00 (donc le matin !).
Donc juste ajouter au message de 47 soit :
$where = "(event_date_debut >= '$sDebutMois' or addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= DATE_ADD('$sFinMois', INTERVAL 1 DAY)";
soit transformer :
$sFinMois = date('Y-m-d H:i:s', mktime(23, 59, 59, $_GET['m']+1, 0, $_GET['y']));
Je trouvais la seconde solution plus claire à relire donc voilà. Les deux se valent je pense... après en termes de performances je ne me prononcerait pas, je n'en sais fichtre rien).

pour ma récupération des jours occupés, j'ai fait un truc franchement tiré par les cheveux... (j'ai du mal à faire simple).

// on récupére le début et la fin du mois
$sDebutMois = date('Y-m-d H:i:s', mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']));
$sFinMois = date('Y-m-d H:i:s', mktime(23, 59, 59, $_GET['m']+1, 0, $_GET['y']));
//addtime ajoute un time à un timestamp
$where = "(event_date_debut >= '$sDebutMois' or addtime(event_date_debut, event_duree) >= '$sDebutMois') and event_date_debut <= '$sFinMois'";

$sql ='SELECT
event_date_debut,
event_duree
FROM
evenements
WHERE
'.$where;
//connexion
bdconnect();
$req = mysql_query($sql) or die('Erreur SQL !
'.$sql.'
'.mysql_error());
//déclaration de l'array
$jours_busy = array();
while ($event = mysql_fetch_array($req))
{
$jourbusy[] = array(
'event_date_debut' => $event['event_date_debut'],
'event_duree' => $event['event_duree']);

//jr début evt : si jr dbt evt est avt jour début mois, alors == jr début mois
$jrDbtEvt =intval(
(strtotime($event['event_date_debut']) < mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']))
? date('d', mktime(0, 0, 0, $_GET['m'], 1, $_GET['y']))
: date('d',strtotime($event['event_date_debut']))
);
//jr fin mois
$jrFinMois = intval(date('d', mktime(00, 00, 00, $_GET['m']+1, 0, $_GET['y'])));
//timstp fin evt
$timstp_fin_evt = strtotime($event['event_date_debut'])+transfo_duree_en_secondes($event['event_duree']);
//timestamp fin mois
$timstp_fin_mois = mktime(00, 00, 00, $_GET['m']+1, 0, $_GET['y']);

//jr fin evt : si jr fin evt est après jour fin mois, alors == jr fin mois
$jrFinEvt =intval(
($timstp_fin_evt > $timstp_fin_mois)
? date('d',$timstp_fin_mois)
: date('d',$timstp_fin_evt)
);
//pr jr = jour dbt evt ; jr<fin_mois ; jr dbt +1
while(($jrDbtEvt <= $jrFinMois) AND ($jrDbtEvt <= $jrFinEvt))
{
//$jours_busy[]= $jrDbtEvt;
if(!in_array($jrDbtEvt,$jours_busy))
{
$jours_busy[]= $jrDbtEvt;
}
$jrDbtEvt++;
}
}
mysql_free_result ($req);

je pense que je vais finalement créer dans ma table une colonne de fin d'evenement directement, renseignée au moment de l'enregistrement, celà simplifiera mes requêtes.

Sujet résolu ! Merci Encore !
0
Rejoignez-nous