Changement de couleur au changement de jour

Petit nouveau ! | 9 Messages

18 déc. 2012, 23:18

Bonjour.

j'aimerais installer un script PHP / MySql sur mon site, qui indiquerait à l'aide de petits drapeaux colorés (images jpg) le niveau de traffic d'une rue par exemple. Je sais comment faire cela à l'aide de menus déroulants qui indiquent en fonction de l'un des trois choix possibles (bon, moyen, mauvais) quel drapeau afficher (vert, orange ou rouge), mais j'aimerais (et c'est là que je bloque) que la couleur du drapeau se remette automatiquement au neutre (avec une image grise par exemple) le jour suivant... Cela doit être faisable, mais je ne sais pas comment...
Si quelqu'un peut m'aider ce serait sympa! ;-)

Mammouth du PHP | 881 Messages

19 déc. 2012, 06:15

De nous dire que tu sais est insuffisant pour que nous puissions t'aider ... ici on bouffe du code alors ... pour alimenter la discussion un peu, il faut nous fournir du code. À partir de là, nous pourrons t'aider un peu.

À vue de nez, j'utiliserais simplement une quatrième catégorie "neutre" et appellerais l'image correspondante.
Ainsi dans un tableau j'aurais
$categ = array("neutre", "bon", "passable", "mauvais");
et dans ma base de données, l'évaluation se ferait en termes de 1, 2, ou 3. Lorsque j'arriverais sur une valeur NULL ou égale à 0, le "neutre" serait affiché par la même fonction que celle appelant les images en fonction des données. Un peu comme ceci:
$QuelEtat = mysql_fetch_assoc(mysql_query("SELECT ValDrapeau FROM laTable WHERE LaDate = NOW()", $db));
 echo '<img src="images/drapeau_".$categ[$QuelEtat["ValDrapeau"]].".png">-<
Souhaitant que ça puisse t'aider un peu.
Le code n'est pas soigné, mais ça te donnera une petite idée.
Soyez artisans de paix

Petit nouveau ! | 9 Messages

19 déc. 2012, 13:06

Merci pour ta réponse!... Voici le code que j'applique:

Formulaire (etat.php):

Code : Tout sélectionner

<select name="circulation"> <option value="gris"></option> <option value="rouge">Mauvais</option> <option value="orange">Passable</option> <option value="vert">Bon</option> </select> <textarea name="details" cols="70" ></textarea> <input type="submit" name="Submit" value="Envoyer">
J'ai créé des images appelées "drapeaurouge.jpg", "drapeauorange.jpg", "drapeauvert.jpg", "drapeaugris.jpg", placées dans mon dossiers "images".

Page php de traitement (etatadd.php) :

Code : Tout sélectionner

<?php include 'fichier_de_connexion_au_serveur.php'; $sql="INSERT INTO $tbl_name(circulation,details,datetime)VALUES('$circulation','$details','$datetime')"; $result=mysql_query($sql); //check if query successful if($result){ echo "<meta http-equiv=\"refresh\" content=\"0;URL=etat.php\">"; } else { echo "ERROR"; } mysql_close(); ?>
et code pour afficher le drapeau (tjrs dans la même page etat.php:

Code : Tout sélectionner

<?php //MySQL Database Connect include 'fichier_de_connexion_au_serveur.php'; $sql="SELECT * FROM $tbl_name ORDER BY id DESC LIMIT 1"; $result=mysql_query($sql); while($rows=mysql_fetch_array($result)){ ?> <p><img src="images/drapeau<? echo $rows['circulation']; ?>.jpg"> Actualisé le <? echo $rows['datetime']; ?> Détails: <? echo $rows['details']; ?></p> <?php } mysql_close(); //close database ?>
Tout fonctionne bien. Le seul hic c'est que je suis obligé d'actualiser l'état manuellement chaque jour et je préfererais qu'il revienne au neutre (drapeau gris) lorsque la journée est finie (ou bien après un certain nombre d'heures par exemple...) Merci pour votre aide!...

Mammouth du PHP | 881 Messages

19 déc. 2012, 16:22

Bonjour,

à ces conditions, j'agirais simplement sur le choix d'image en fonction de l'ancienneté de l'information. Du genre:
<?php $rows['circulation'] = ( time() -$rows['datetime'] < 3660 ) ? $rows['circulation'] : "gris"; ?>
<p><img src="images/drapeau<? echo $rows['circulation']; ?>.jpg">  Actualisé le <? echo $rows['datetime']; ?> Détails: <? echo $rows['details']; ?></p>
                
Ceci à la condition que $rows['datetime'] soit un timestamp.
J'ai mis 3660 pour écrire quelque chose, mais tu mets bien ce que tu veux.

Le principe étant de simplement évalué l'âge de l'information avant de choisir le drapeau à afficher.


En passant: la balise correcte de php est <?php
Soyez artisans de paix

Petit nouveau ! | 9 Messages

20 déc. 2012, 00:06

Merci pour ta réponse, mais lorsque je mets ton code, cela m'affiche le drapeau en gris tout le temps.
Mon datetime est sous la forme 2012-12-19 22:57:04 ... Faudrait-il le convertir en secondes?? ..mais je ne sais pas comment faire.
Désolé. En tous cas je pense que c'est la piste à suivre... renseigner le champ datetime (ou un second champ dédié timestamp) avec les secondes et puis comparer avec le "now" à l'affichage...
Je ne dois pas être loin....
Merci... Si tu peux finir de m'aider... :wink:

Mammouth du PHP | 881 Messages

20 déc. 2012, 01:06

Puisque ce que me semble le début du projet, j'en profiterais pour changer les paramètres du champ de données et le mettrais au format timestamp. C'est - à mon avis - le format le plus pratique. Pour le rendre lisible aux humains c'est très facile et pour faire des calculs, c'est direct. Vivement le timestamp.

Si ta table est déjà passablement remplie, tu peux encore ajouter un champ (au format timestamp) et faire quelques manip pour coordonner ces infos avec l'autre champ déjà existant. Ton info se trouvera ainsi doublée. La manip est - évidemment - facultative si tu ne compte pas travailler sur les archives, mais il serait bon - quoi que tu fasses - de garder une trace qui indiquera à quel moment la validité du timestamp a priorité sur l'autre champ.

Autrement, il faut comparer les oranges avec les oranges et les pommes avec les pommes. C'est sûr que tu ne dois pas comparer une date au format international avec un timestamp. À toi de choisir lequel tu convertiras.


Comme tu dis, mon code donne toujours du gris. C'est sûr qu'un délai de 2660 c'est très court. Timestamp travaille en secondes donc un jour vaut 24 * 60 * 60 = 86400 secondes, une heure 3600 secondes. De plus, je crains avoir mis l'opérateur en envers ("plus petit que" à la place de "plus grand que"). Ajuste à ton goût. Je voulais simplement te filer la piste à suivre. Le reste n'est que polissage.

Bonne chance.
Soyez artisans de paix

Petit nouveau ! | 9 Messages

20 déc. 2012, 14:44

Merci!
J'ai essayé ça:
<?php $rows['circulation'] = (time() - strtotime($rows['datetime']) > 3660 ) ? $rows['circulation'] : "gris"; ?>
...mais sans résultat.. :(

Si je fais
<? echo strtotime($rows['datetime']); ?>
cela me retourne bien le nbre de secondes depuis 1970... mais la formule
time() - strtotime($rows['datetime']) > 3660
ne fonctionne pas...

Je vais continuer de chercher... Je ne suis pas loin. Merci pour ton aide. Si tu as des infos, n'hésite pas :wink:

Mammouth du PHP | 881 Messages

20 déc. 2012, 15:32

Bonjour,

essaie simplement de mettre le calcul entre parenthèses comme ceci:
 (time() - strtotime($rows['datetime'])) > 3660
afin d'être sûr que PHP fasse la soustraction avant de comparer avec 3660.

Autrement, il faudrait nous donner le message d'erreur obtenu.
Soyez artisans de paix