Affichage d'événements à venir

Invité
Invité n'ayant pas de compte PHPfrance

24 août 2009, 21:13

Bonjour,

Je suis nouveau et je viens vous embêter :P (un petit peu)

Je souhaiterais afficher sur ma page une sorte de mini agenda qui m'afficherait des événements à venir (dans la limite de 2 ou 3 pour l'instant, même si ma base de données en contient beaucoup plus).

Dans ma BDD, il devrait y avoir une table 'representations' avec les champs id, date, et lieu.
Comment organiser ? Un champ VARCHAR pour le lieu, et un DATE pour la date ? Sous quel format envoyé la date à partir de la requête INSERT INTO dans ma page php ?
Et dans ma page où doit s'afficher les 2 prochains événements à venir (et pas ceux qui sont passés), la requête SQL doit être comme ceci :

Code : Tout sélectionner

SELECT * FROM representations WHERE 'date' >= current_timestamp ORDER BY date DESC
(merci à J-L).

Merci d'avance à ceux qui prendront le temps (s'il y en a :lol: ) de m'aider.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

24 août 2009, 21:39

Pour la date tu peux utiliser un format INT(11) dans ta table et l'enregistrement se fera en timestamp avec time() que tu pourras facilement manipuler, comparer...etc

Et donc ta requête sera
mysql_query("SELECT * FROM representations WHERE date >= '".time()."' ORDER BY date DESC")

ViPHP
AB
ViPHP | 5818 Messages

24 août 2009, 22:18

EDIT :J'avais pas vu la réponse de charabia.
Voici donc une autre méthode :
Comment organiser ? Un champ VARCHAR pour le lieu, et un DATE pour la date ? Sous quel format envoyé la date à partir de la requête INSERT INTO dans ma page php ?
Il faut insérer ta date au format date aaaa-mm-jj pour pouvoir ensuite utiliser les fonctions de tri mysql.

Et dans ma page où doit s'afficher les 2 prochains événements à venir (et pas ceux qui sont passés), la requête SQL doit être comme ceci :

Code : Tout sélectionner

SELECT * FROM representations WHERE 'date' >= current_timestamp ORDER BY date DESC
(merci à J-L).
Je ferais plutôt comme ci-dessous (avec éventuellement LIMIT 2 pour ne retourner que les 2 prochains évènements)
SELECT * FROM representations WHERE date > NOW() ORDER BY date ASC LIMIT 2

Invité
Invité n'ayant pas de compte PHPfrance

25 août 2009, 12:29

Ok, merci pour vos explications et votre réactivité.
Ma BDD me renvoie les infos souhaitées, c'est super, la requête est bien mieux avec LIMIT 2, j'y avais pensé hier soir ! (la nuit porte conseil)
:wink:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

25 août 2009, 14:39

Modération :
Puisque ta question est résolue, je l'indique en ajoutant la petite icône verte "Résolu" pour que les futures personnes qui voudront consulter ce sujet sachent qu'il contient une solution.

Tu peux réaliser cette opération toi-même en cliquant sur le bouton Image en haut à droite de la réponse qui te semble la plus pertinente, si tu as posté le 1er message en tant que membre (inscrit et identifié).

Alors... inscris-toi !!! ;)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 5 Messages

26 août 2009, 22:07

Et bien merci. Je m'étais pourtant inscrit... pourtant...

Enfin bref, MERCI à vous :D

Jean Miche

Petit nouveau ! | 5 Messages

27 août 2009, 16:43

Finalement j'ai un nouveau soucis ...

La page m'affiche toujours les representations passées celle d'hier par exemple... je sui sûr que ça vient de ma requête.
SELECT * FROM representations WHERE 'date' >= CURRENT_DATE() ORDER BY date LIMIT 2
à la place de CURRENT_DATE(), j'ai essayé avec DATE(), CURDATE(), ou même NOW(), mais ça ne marche dans aucun des cas. Ca m'affiche toujours la représentation d'hier soir.

Avatar du membre
ViPHP
ViPHP | 3008 Messages

27 août 2009, 19:04

Quel est le format du champ date de ta table ?

Petit nouveau ! | 5 Messages

27 août 2009, 19:26

Dans ma base, la date est de style DATE, au format AAAA-MM-JJ.

Sur ma page je renvoie la date au format français par contre :
<?php echo date("d-m-Y", strtotime($ligne["date"])); ?>

Petit nouveau ! | 5 Messages

27 août 2009, 19:45

Ok j'ai trouvé... et y'a de quoi grincer des dents...
Relisez ma requête :

Code : Tout sélectionner

SELECT * FROM representations WHERE 'date' >= CURRENT_DATE() ORDER BY date LIMIT 2
La faute était due aux quote autour du nom de la table date. Rageant.
Merci à vous pour tout !

Mais puis-je vous poser une autre question ?
La page me retourne des � pour chaque caractère spécial.
Ma page est en utf-8 dans le head :

Code : Tout sélectionner

<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Et dans ma base, l'interclassement du champ lieu est latin1_swedish_ci.
J'ai trouvé une "astuce" qui permettrait d'afficher les caractères correctement en ajoutant

Code : Tout sélectionner

mysql_query("SET NAMES UTF8");
Est-ce possible de la sorte car je n'y arrive pas (oui je suis un boulet...), ou sinon, je l'ai mal placé (dans ma page php sous ma requête)

Merci d'avance.

ViPHP
AB
ViPHP | 5818 Messages

27 août 2009, 21:55

Pour les quotes autour du champ 'date' qui faisaient bugguer ta requête, remarque que je les avaient enlevées dans ma précédente proposition de requête :wink:
J'avais employé NOW() qui fonctionne d'une manière générale avec les champs au format date ou datetime mais CURRENT_DATE() est suffisant pour les champs date et donc légèrement plus approprié.

Pour l'UTF-8, il y a un tuto ici

Effectivement mettre la ligne mysql_query("SET NAMES UTF8"); juste après la connexion à la base de donnée indique à mysql de travailler en utf-8 (pour l'instant paramétré par défaut en iso), mais cela ne t'empêches pas pour autant d'indiquer le bon format pour l'interclassement dans ton champ "lieu" : "utf-8 general ci" pour non sensble à la casse ou "utf-8 bin" pour sensible à la casse. C'est très facile depuis phpmyadmin.

Petit nouveau ! | 5 Messages

27 août 2009, 22:49

Je suis vraiment désolé de ne pas avoir vu ce détail de quotes plus tôt AB. Ca m'apprendra à être plus attentif...

En tous cas, merci pour tout, et puis oui, la prochaine fois je cocherai la petite coche verte en haut du sujet pour dire que vous avez été d'une super efficacité !

A+ :wink: