le 19 Juin participez à Drupagora

conseils pour un tri par champ date(text)

VaN
Mammouth du PHP | 1107 Messages

27 Juin 2005, 17:33

Table mois :
Image

Table annee :
Image

Table articles :
Image

dsl de mon erreur sur structure/affichage : /

ViPHP
pjl
ViPHP | 2115 Messages

27 Juin 2005, 17:52

quel est la différence entre la date et date_entrée ?

pourquoi avoir mis date au format texte et pas date ?

sinon, il vaut mieux éviter d'avoir des noms de champ reprennant des noms utilisés par la base de données comme ici cate.

VaN
Mammouth du PHP | 1107 Messages

27 Juin 2005, 17:57

date est un champ remplie par une concatenation de 2 <select>, un affichant les mois, l'autre les années. date_entree est remplie par la fonction date().

J'utilise les 2 champs pour avoir tout le temps la date de creation de l'article (date() ) et une 'fausse' date, si l'auteur veut lié cet article au moins de juillet, tout en l'ayant ecrit au mois de juin par exemple.

date est au format texte car les valeurs qu'il contient sont de cette forme :
Juin 2005 , Aout 2006 , etc..
je pensais que ça serait plus facile.. au final ça fout le merdier on dirait :(

ViPHP
pjl
ViPHP | 2115 Messages

27 Juin 2005, 18:10

en fait, tu aurais pu stocker au format date en prenant comme convention pour le jour le 1er du mois et tu n'exploites que le mois et l'année.
Grosso modo, tu continues à concaténer et systématiquement, tu fais : $date .= "-1";

VaN
Mammouth du PHP | 1107 Messages

28 Juin 2005, 09:52

mon probleme n'est toujours pas résolu. Je suis en train de penser à une autre methode.

Peut etre serait-il plus simple de decouper mon champ date en 2 champs distinct, un pour le mois, et un pour l'année ?
la requete serait surement plus facile à réaliser nan ?

Avatar de l’utilisateur
Modérateur PHPfrance
Modérateur PHPfrance | 2560 Messages

28 Juin 2005, 12:55

Non non, tu complique encore une fois le problème.
pour les deux dates d'après ce que j'ai compris, tu n'as qu'à dire :
"j'ai une date de création de l'article et une date de réapprovisionnement"
Mais les deux sont au format date. Les dates doivent toujours être stocker comme des dates brutes.
C'est à ton programme (requêtes SQL) d'en diversifier l'utilisation et le format d'affichage en utilisant des fonction spécialisées comme day(), month(), year() et date_format()

Pour plus d'info : http://www.nexen.net/docs/mysql/annotee ... ate_format

Alors, dans ton cas et si j'étais à ta place, je stockerais les date dans leurs état brut sous le type date.
Et quand par exemple j'ai besoin de remplir une nouvelle date de réapprovisionnement (disons Juillet) d'un article créé en Juin, en choisissant d'enter la date via des listes déroulante, je ferais ceci:

id_mois et id_année : deux listes déroulantes.
Quand l'utilisateur choisit un mois dans id_mois et une année id_année
Construire la date : "id_année/id_mois/01" et la stocker dans le champs "date" de article.

Code de l'exemple : (exige qu'un article est déja présent et que $ref_art est connue.

[php]
<form>
<input type=hidden name=ref_art value=<? echo isset($ref_art)?$ref_art:null; ?>
<p>Choisir une date de réapprovisionnement
<p>Année
<select name=id_année>
<option value='0'></option>
<option value='2004'>2004</option>
<option value='2005'>2005</option>
...
</select>
<p>Mois
<select name=id_mois>
<option value='0'></option>
<option value='1'>Janvier</option>
<option value='2'>Février</option>
...
</select>
<p><input type=submit name=modifer_date value='Modifier date réappro.'>
</form>

<?
//Programme de modification de la date réappro.

//Réception valeurs sélectionnées dans les select (0 si rien)
$id_année = isset($_GET["id_année"])?$_GET["id_année"]:0;
$id_mois= isset($_GET["id_mois"])?$_GET["id_mois"]:0;

//Reception de la ref de l'article concerné par la modif
$ref_art = isset($_GET["ref_art "])?$_GET["ref_art "]:null;

//si c'est l'action 'modifier_date' est déclenchée
//et si des valeurs correctes sont séléctionnées et qu'un article est en cours
if (isset($_GET["modifer_date"]) && $ref_art != null && $id_année != 0 && $id_mois != 0) {
//Quoi faire des valeurs reçu ? : Les stocker en mettant à jour la table article clé =$ref_art
$sql = "UPDATE article SET date = '$id_année/$id_mois/01' WHERE ref='$ref_art' ";
mysql_query ($sql); //exécuter l'update
}


[/php]

Remarque
: l'affichage affiche les noms des mois et des années mais mon programme manipule leurs id numériques et stocke la date sous le format date
Dernière édition par sadeq le 28 Juin 2005, 13:09, édité 1 fois.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

ViPHP
pjl
ViPHP | 2115 Messages

28 Juin 2005, 13:06

VaN a écrit :mon probleme n'est toujours pas résolu. Je suis en train de penser à une autre methode.

Peut etre serait-il plus simple de decouper mon champ date en 2 champs distinct, un pour le mois, et un pour l'année ?
la requete serait surement plus facile à réaliser nan ?

Avant de dire celà, as tu étudié ma solution ?

VaN
Mammouth du PHP | 1107 Messages

28 Juin 2005, 13:13

pjl a écrit :Avant de dire celà, as tu étudié ma solution ?


Oui. Mais mon probleme majeur est que une enorme partie de mon code (en tout cas de mes tris déjà fonctionnels) est basé sur ce systeme de date au format text. La solution "passer toutes mes date(text) en date(date)" etait pour le moment lpour moi la dernière des solutions envisageables, à utiliser vraiment si je ne trouvais pas comment faire ce tri. Je penses que maintenant je vais me tourner vers ça : / bcp de travail avant de revoir marcher correctement mon interface donc :?

VaN
Mammouth du PHP | 1107 Messages

28 Juin 2005, 15:32

Bon bin voilà, toutes mes date(text) ont été tranformées en date(date), ainsi que les requetes de SELECT et de INSERT liées à tout ça.

Maintenant je souhaite faire un <select> qui servira pour trier les articles par mois.
Je voudrais dont sortir toutes les date de mes articles, et crée le select avec une boucle. Mais je voudrais sortir une valeur unique de chaque date, c'est à dire que si plusieurs articles ont la meme date, en sortir qu'une seule de cette valeur. J'imagine que cela se fait dans la requete SQl. Comment faire cela ? C'est DISTINCT qui permet de faire cela ?

[edit] ah bin oui c'est DISTINCT, vais test ça

VaN
Mammouth du PHP | 1107 Messages

28 Juin 2005, 16:12

[php]
<?php
$sql_sort = "SELECT DISTINCT date FROM articles";
$query_sort = mysql_query($sql_sort);
while ($result_sort = mysql_fetch_array($query_sort))
{
$date_exp = explode("-",$result_sort['date']);
$mois_exp = $date_exp[1];
$annee_exp = $date_exp[0];

$sql = "SELECT mois FROM mois WHERE id_mois='$mois_exp'";
$query = mysql_query($sql);
$result = mysql_fetch_array($query);
?>

<option value="<?php echo $result_sort['date']; ?>"
<?php
if (isset($_GET['date']))
{
if ($_GET['date']==$result_sort['date'])
{
echo "selected";
}
}
?>
>
<?php echo $result['mois']." ".$annee_exp ?>
</option>
<?php
}
?>
</select>
[/php]

me sort ce code source :

Code : Tout sélectionner

<select name="date" onchange="submit()" style="margin:0px; ">
<option value="no">Choose a date</option>
<option value="2005-06-20">June 2005</option>
<option value="2005-06-23">June 2005</option>
<option value="2005-06-17">June 2005</option>
<option value="2005-06-24">June 2005</option>
<option value="2005-06-27">June 2005</option>
<option value="2005-07-28">July 2005</option>
<option value="2005-01-01">January 2005</option>
</select>


Pourtant après verification sur la doc MySQL, c'est bien aisni que s'utilise DISTINCT. où est mon erreur ?

[edit] Aaaaah mais nan ok, les jours sont différents, c'est pour ça !! je n'est pas fait attention à la value, juste au contenu des <option>. Hum, comment faire pour récuperer seulement une partie de mon champ date ds ma requete SQL, en l'occurence seulement l'année et le mois ici ?

je pense avoir trouvé une feinte. Vu que le jour ne m'est d'aucune utilité, je defini une variable $day = "01"; que j'utiliserais quand je rentre la date ds la bdd. C'est pas super propre, mais ça marche.

ViPHP
pjl
ViPHP | 2115 Messages

28 Juin 2005, 17:08

Et si tu prennais la peine de bien lire les réponses que l'on prend la peine de te faire ?

VaN a écrit :[edit] Aaaaah mais nan ok, les jours sont différents, c'est pour ça !! je n'est pas fait attention à la value, juste au contenu des <option>. Hum, comment faire pour récuperer seulement une partie de mon champ date ds ma requete SQL, en l'occurence seulement l'année et le mois ici ?

Jette donc un oeil à la page précédente.

VaN a écrit :je pense avoir trouvé une feinte. Vu que le jour ne m'est d'aucune utilité, je defini une variable $day = "01"; que j'utiliserais quand je rentre la date ds la bdd. C'est pas super propre, mais ça marche.

=D> =D>
pjl a écrit :en fait, tu aurais pu stocker au format date en prenant comme convention pour le jour le 1er du mois et tu n'exploites que le mois et l'année.

VaN
Mammouth du PHP | 1107 Messages

28 Juin 2005, 17:15

:oops: :cry:

sans rancune j'espere..