8791 sujets

Développement web côté serveur, CMS

Bonjour à tous,

j'ai un problème concernant la date de mes évènements...

Pour que l'utilisateur saisisse une date, j'ai créer un calendrier en JS qui récupère la date en français (j/m/a) dans un input.

<input type="text" id="ddebut" name="ddebut" onclick="ds_sh(this,'ddebut',568);" readonly="readonly" value="<?php echo $ddebut; ?>" /></td>


Jusque là, tout va bien, maintenant, j'ai un problème derrière, je dois faire une chercher en fonction des dates (d'arrivée et de départ en gros). Sachant que c'est dans la base de données en tant que Varchar pour la date, je n'arrive pas tellement à faire les recherches.
Sachant que si par exemple j'ai départ : 02/07/2011 et retour 15/07/20011 je dois afficher tout se qu'il y a dans ma base qui ont une date en commun (si pour un truc c'est départ 13/07/2011 on l'affiche).

Du coup, je voulais savoir d'une part, soit si quelqu'un a une solution pour faire les affichages comme il faut ; soit si je peux transposé ma date de type jj/mm/aaaa pour la rentré sous forme de "date" dans la base ?

Merci d'avance !

RESOLU pour transposer la date dans la BDD !

$dob1=trim($_POST['dfin']);//$dob1='dd/mm/yyyy' format
list($d, $m, $y) = explode('/', $dob1);
$mk=mktime(0, 0, 0, $m, $d, $y);
$dobdisp1=strftime('%Y-%m-%d',$mk);

Modifié par louloute (01 Aug 2011 - 11:12)
Du coup j'ai un autre problème maintenant...

Je veux sélectionner les voyages qui se trouvent entre deux dates.

L'utilisateur remplis une date de début et une date de fin : $debut et $fin

Comme c'est rentré en type varchar dans la base de donnée, on extrait les infos :
$annee_debut = substr($debut, -4);
$annee_fin = substr($fin, -4);
						
$mois_debut = substr($debut, -7,2);
$mois_fin = substr($fin, -7,2);

$jour_debut = substr($debut, -10,2);
$jour_fin = substr($fin, -10,2);


En vient ma requête :


$req = "SELECT * FROM voyage, pays, animateur 
WHERE voyage.ID_animateur = animateur.ID_animateur 
          AND voyage.ID_pays = pays.ID_pays 
          AND EXTRACT(MONTH FROM Date_debut) = $mois_debut 
          AND EXTRACT(MONTH FROM Date_fin) = $mois_fin 
          AND EXTRACT(YEAR FROM Date_debut) = $annee_debut 
          AND EXTRACT(YEAR FROM Date_fin) = $annee_fin 
          AND EXTRACT(DAY FROM Date_debut) = $jour_debut 
          AND EXTRACT(DAY FROM Date_fin) = $jour_fin";


Ce code ne marche que s'il rentre les valeurs exactes du voyages.

Par contre, je voudrais modifier ce code de manière à afficher tous les voyages, ayant une date en commun avec l'intervalle de date choisi par l'utilisateur.

Exemple :
voyage 1 du 12/07 au 20/07
voyage 2 du 30/07 au 07/08

Taper par l'utilisateur : 15/07 au 25/07
Résultat : voyage 1 affiché, voyage 2 non affiché

Merci d'avance
Modifié par louloute (29 Jul 2011 - 14:44)
Bonjour à toutes et à tous,

1) pourquoi avoir mis une date sous le format varchar dans la table MySql ?

VARCHAR est utilisé pour les chaine de caractères lorsque l'on ne connait pas la longueur. Ou si vous préférez, la longueur est variable.

Maintenant, tout dépend de ce que vous entendez par date ?
Si vous utilisez la date + l'heure alors le format TIMESTAMP est le mieux. Et la représentation sera "AAAA-MM-JJ HH:MM:SS".

Si vous n'utilisez que la date alors le format DATE convient très bien pour cette usage.

Et puis comme vous faites des opérations sur cette date alors il convient d'utiliser le bon format. Même si l'information que vous allez stocker est redondante (par exemple la date au format chaine de caractères dans VARCHAR et la date au format DATE pour des extractions), pour des questions de lisibilités du code MySql et de performances, il est préférable d'avoir une date au bon format !

De plus, assurez-vous que le format de stockage soit bien "AAAA-MM-JJ".

2) Pour sélectionner des lignes dans une table MySql, vous devez les encadrer dans un intervalle comme suit :
sql = "SELECT * FROM table WHERE datenreg BETWEEN " $date_debut " AND " $date_fin; 
ou encore
sql = "SELECT * FROM table WHERE datenreg >= " $date_debut " AND datenreg <= " $dat_fin;

Je n'ai pas testé cela, mais l'idée est là.

3) Pour des questions de performances du SELECT, faite des préparations de la mise en forme de votre requête SQL. Essayez de mettre le moins possible de fonction dans votre SELECT !

J'ai souvent entendu dire que la deuxième écriture est préférable à la première (sans BETWEEN).

De plus, lorsque l'on extrait des colonnes d'une table, on ne met jamais SELECT * mais plutôt SELECT id, nom, prenom car si vous utilisez que ces trois colonnes, pourquoi tout extraire ? Et en plus, cela prend beaucoup de places en mémoire ! Donc bonjour les performances dégradées.

De même, il est souhaitable de créer un index sur cette date, car vous faites des sélections. Mais ça, c'est une autre histoire, qui n'a rien avoir avec votre problème.

Bon courage.
Modifié par Artemus24 (29 Jul 2011 - 17:33)
Enfait dans ma base de données, la date est de type DATE (je n'ai pas besoin de l'heure)

par contre, quand l'utilisateur saisie une date au clavier (données non enregistrées) c'est une chaine de caractère, que j'ai découpé pour récupérer les informations.


J'ai essayé d'adapter ton bout de code, mais pour l'instant ça ne fonctionne pas encore!
Re-bonjour,

j'insiste sur le format des dates que tu vas utilisés.

En fait tu as trois dates : datenreg (celle de ta BDD MySql) et celles du PHP : date_debut et dat_fin.

Le bon format de date est celui de ta BDD MySql. Donc si le bon format est "AAAA-MM-JJ", tu dois faire en sorte que la date de début et de fin soit aussi au même format.

N'hésite pas à faire un ECHO dans ton programme PHP pour t'assurer et visualiser le bon format de tes dates.

Mieux vaut utiliser la fonction date pour le formatage !
echo date("Y-m-d", mktime(0, 0, 0, $Mois, $Jours, $AN));

http://php.net/manual/fr/function.date.php

@+
Modifié par Artemus24 (29 Jul 2011 - 16:47)
Re-bonjour,

je vais t’embêter encore un peu...

J'ai changer la forme de ma date saisie, c'est donc ça qui ne marchait pas.

J'ai donc le code suivant qui fonctionne :
$sqlvoy = "SELECT * FROM voyage, animateur WHERE voyage.ID_animateur = animateur.ID_animateur AND Date_debut BETWEEN '$debut' AND '$fin' ";


J'ai un autre problème, c'est que j'ai une Date_debut et une Date_fin... Je n'arrive pas à lui donner les instructions pour que fasse la même chose pour la date de fin...
j'ai essayé :

$sqlvoy = "SELECT * FROM voyage, animateur WHERE voyage.ID_animateur = animateur.ID_animateur AND Date_debut BETWEEN '$debut' AND '$fin' AND Date_fin BETWEEN '$debut' AND '$fin' ";


Mais ça ne semble pas le prendre en compte...

une idée ?
Modifié par louloute (29 Jul 2011 - 16:59)
Re-bonjour,

je suppose que dans ta table, date_debut <= date_fin pour une ligne donnée ?
Tu n'es pas obliger de tester :
$debut <= date_debut <= $fin
$debut <= date_fin <= $fin

mais fait simplement :

$debut <= date_debut AND
date_fin <= $fin
Et cela est grandement suffisant !

Et de plus, tu fais une jointure entre deux tables, dont l'une contient date_debut et date_fin ?
Lorsque tu fais une jointure entre deux tables, il faut toujours préciser à quelle table appartient telle colonne.

$sqlvoy = "
select *
from voyage,
     animateur

where voyage.date_debut >= " $debut "
and   voyage.date_fin   <= " $fin   "
and   voyage.id_animateur = animateur.id_animateur

";
Ne met pas SELECT * mais plustôt SELECT voyage.ID_animateur, voyage.date_debut, voyage.date_fin
c'est à dire uniquement les colonnes dont tu as besoins !

@+
Modifié par Artemus24 (29 Jul 2011 - 17:37)