8791 sujets

Développement web côté serveur, CMS

Bonjour.

Après moult recherches sur Internet je me vois contraint de vous embêter.

Données

J'ai une base de données MySQL contenant divers champs dont un champ "datefichier".

Problématique

Je cherche à mettre une couleur de fond à une cellule d'une table suivant certains critères :
- En vert si "date du jour" est strictement inférieure à "datefichier + 335 jours"
- En orange si "date du jour" est inférieure ou égale à "datefichier + 365 jours"
- En rouge si "date du jour" est strictement supérieure à "datefichier + 365 jours"

Soucis rencontrés

J'ai bien trouvé une fonction DATE_ADD de MySQL mais je ne parviens pas à comprendre comment l'utiliser et surtout, comment m'en servir dans un test (tel que définit ci-dessus). Smiley confus Comment récupérer le résultat d'une telle requête ? Smiley sweatdrop

Bref, je patauge complètement ! Smiley ohwell

Pouvez-vous m'aider sur le codage d'un tel test ? Smiley confused

Cordialement.
Modifié par nikkyken (05 Jan 2010 - 15:21)
Bonjour mistike.

Oups. Effectivement, j'ai oublié de préciser. Smiley biggol

Il s'agit d'un champ 'date' au format '0000-00-00' (l'heure m'est inutile).

Une petite idée sur la façon de procéder ? Smiley confused

Cordialement.
Salut,

SELECT
   CASE
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) > `date_jour` THEN "vert"
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) = `date_jour` THEN "orange"
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) < `date_jour` THEN "rouge"
   END AS "couleur"
Hum. Déjà, tu vas devoir le faire en php, et pas avec MySQL. Voici une première idée, mais d'autres forumeurs plus forts que moi en php me corrigeront si nécessaire Smiley cligne

Ton amie : la fonction php strotime() qui convertit une date en "timestamp unix", c'est-à-dire le nombre de secondes depuis le 01/01/1970 00h00. Evidemment si tes dates peuvent être antérieures à celle-ci, on va avoir un problème.



// On suppose que la connection à la base est ok

// Récupération des dates
$req = mysql_query ('SELECT datefichier FROM matable');

echo '<table>

// Pour chaque enregistrement
while ($data = mysql_fetch_assoc($req_select))
{
   // La date à comparer
   $onzemois = strotime($data['datefichier'] + 28944000;
   $unan = strotime($data['datefichier'] + 31536000;

   echo '<tr><td><truc></td>
           <td>machin</td>
           if (strotime('now') < $onzemois)
               echo '<td class="vert"> . $data['datefichier'] . </td>';
           elseif ((strotime('now') < $unan)
               echo '<td class="orange"> . $data['datefichier'] . </td>';
           else echo '<td class="rouge"> . $data['datefichier'] . </td>';
           echo '</tr>
}
echo '</table>


Et dans ton CSS :


.vert {background:color: #0CDF00;}
.orange {background:color: #FFA200;}
.rouge {background:color: ##FF0000;}


Bon je le dis tout de suite, je n'ai absolument pas testé ! (peux pas tester d'où je suis).
Modifié par mistike (05 Jan 2010 - 14:18)
Agylus a écrit :
Salut,

SELECT
   CASE
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) > `date_jour` THEN "vert"
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) = `date_jour` THEN "orange"
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) < `date_jour` THEN "rouge"
   END AS "couleur"


Ah oui, dis donc !

Edit : oui mais c'était 335 jours, la première condition, pas un an (sauf faute de frappe). 'date_du_jour' pourrait être remplacée par CURDATE si c'est bien la "date d'aujourd'hui" qu'il souhaite.
Modifié par mistike (05 Jan 2010 - 14:21)
mistike a écrit :
Edit : oui mais c'était 335 jours, la première condition, pas un an (sauf faute de frappe).

Effectivement, j'avais lu 365.
Dans ce cas, il suffit de remplacer "INTERVAL 1 YEAR" par "INTERVAL 335 DAY" dans la première ligne.
Agylus a écrit :
Salut,

SELECT
   CASE
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) > `date_jour` THEN "vert"
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) = `date_jour` THEN "orange"
      WHEN ADDDATE( `date_fichier`, INTERVAL 1 YEAR ) < `date_jour` THEN "rouge"
   END AS "couleur"


Merci Agylus pour ce code mais... je me trompe ou ça n'est pas du PHP ? Est-ce facilement transportable sous PHP ? Smiley confused

mistike a écrit :
Hum. Déjà, tu vas devoir le faire en php, et pas avec MySQL. Voici une première idée, mais d'autres forumeurs plus forts que moi en php me corrigeront si nécessaire Smiley cligne

Ton amie : la fonction php strotime() qui convertit une date en "timestamp unix", c'est-à-dire le nombre de secondes depuis le 01/01/1970 00h00. Evidemment si tes dates peuvent être antérieures à celle-ci, on va avoir un problème.



// On suppose que la connection à la base est ok

// Récupération des dates
$req = mysql_query ('SELECT datefichier FROM matable');

echo '<table>

// Pour chaque enregistrement
while ($data = mysql_fetch_assoc($req_select))
{
   // La date à comparer
   $onzemois = strotime($data['datefichier'] + 28944000;
   $unan = strotime($data['datefichier'] + 31536000;

   echo '<tr><td><truc></td>
           <td>machin</td>
           if (strotime('now') < $onzemois)
               echo '<td class="vert"> . $data['datefichier'] . </td>';
           elseif ((strotime('now') < $unan)
               echo '<td class="orange"> . $data['datefichier'] . </td>';
           else echo '<td class="rouge"> . $data['datefichier'] . </td>';
           echo '</tr>
}
echo '</table>


Et dans ton CSS :


.vert {background:color: #0CDF00;}
.orange {background:color: #FFA200;}
.rouge {background:color: ##FF0000;}


Bon je le dis tout de suite, je n'ai absolument pas testé ! (peux pas tester d'où je suis).


Merci mistike.

Je viens de tester mais, je me retrouve avec le message d'erreur suivant :

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, string given in [...] on line 83

Et voici la fameuse ligne 83 :

while ($data = mysql_fetch_assoc($req))


J'ai vraiment l'impression d'être un boulet avec ce code Smiley lol

Un petit conseil à me donner ? Smiley confused
Salut,

+1 pour la solution d'Agylus mais personnellement j'aurais plutôt fait le traitement côté PHP car :
* les couleurs peuvent changer,
* on peut rajouter des périodes
* les CASE / WHEN alourdissent (un peu) les requêtes.
* je pense qu'il vaut mieux retoucher plus tard au PHP qu'au SQL.

Du coup j'aurais fait :
SELECT datefichier, TO_DAYS(NOW()) - TO_DAYS(datefichier) as delai FROM matable

require_once('connexion.inc.php');
$sql = 'SELECT datefichier, TO_DAYS(NOW()) - TO_DAYS(datefichier) as delai FROM matable';
$result = mysql_query($sql);
while ($row = mysql_fetch_assoc($result)) {
	$delai = $row['delai'];
	switch($delai) {
		case ($delai < 335) :
			$classe_td = 'vert';
			break;
		case ($delai <= 365) :
			$classe_td = 'orange';
			break;
		default:
			$classe_td = 'rouge';
			break;
			
	}
	echo '<p>Date : '.$row['datefichier'].' / Classe : '.$classe_td.'</p>';
}

Modifié par Heyoan (05 Jan 2010 - 15:10)
nikkyken a écrit :


Merci Agylus pour ce code mais... je me trompe ou ça n'est pas du PHP ? Est-ce facilement transportable sous PHP ? Smiley confused


c'est une requête SQL .

nikkyken a écrit :

Merci mistike.

Je viens de tester mais, je me retrouve avec le message d'erreur suivant :

Warning: mysql_fetch_assoc() expects parameter 1 to be resource, string given in [...] on line 83



J'ai fait un copier-coller Smiley langue

remplace $req_select par $req dans mon code.

Ceci dit, la solution de Heyoan est pas mal du tout, voire mieux que la mienne !
Oulalala !!!! Smiley biggol

Je cherche un tapis pour me cacher ! J'avais pas capté sur le moment que c'était la requête SQL. Désolé Agylus.

En tout cas, merci grandement à vous pour votre aide. Smiley confused

J'ai finalement opté pour la solution de Heyoan.

Encore une fois... Bravo à Alsacréations !!!! Smiley ravi