Page 1 sur 2

Liste d'archive

Posté : 01 juin 2008, 11:32
par djtec
Bonjour,

Voilà je voudrais faire une liste d'archive comme sur les blogs du type mars 2008, etc.

J'enregistre toutes mes dates avec la variable time() dans ma bdd.

Mais je ne vois pas quelle requête sql exécuter pour cela et n'y quel script php utiliser pour m'afficher le résultat.

Merci d'avance.

Posté : 02 juin 2008, 16:13
par Invité
Tu pourrais reformuler ta question, car pour le moment on a l'impression que tu cherche un pigeon pour te donner un script prêt à l'emploi.

Posté : 02 juin 2008, 21:56
par djtec
Bonsoir,

Non je recherche pas un pigeon pour me donner un script.

Je voudrais juste que l'on m'explique la requête sql qui faudrait pour voir tout les mois et année qui sont dans ma table enregistrer avec la variable time() et m'expliquer le fonctionnement du script php pour vérifier les dates et eviter les doublons et l'affichage sous forme:

Mars 08
Avril 08
etc ...

J'espère que ce coup j'ai réussi à être assez expliciste.

Merci d'avance.

Posté : 02 juin 2008, 23:20
par ouckileou
QUel est le type de la colonne qui stocke ce Timestamp ? (pour moi ce n'est pas la solution la plus pratique pour stocker, un type de colonne DATETIME (date+heure) serait plus lisible pour stocker les dates des billets qu'un nombre de secondes mais bon)

Regarde la doc MySQL : http://dev.mysql.com/doc/refman/5.0/fr/ ... tions.html

Essaie déjà de retourner le timestamp de chaque entrée de ta table sous forme "mois/année"

Posté : 03 juin 2008, 00:07
par djtec
Le type est un varchar banal.

J'ai fait ceci en php pour avoir toute mes dates au format mois/année
$sql = "select * from ".$prefix.TABLE_POST." where post_id = '".$idtem."'";
$req = $db->dj_query($sql);

while($row = $db->dj_fetch_array($req))
   {

        $date = dj_month_format(date('m', $row['post_time'])).' '.date('Y', $row['post_time']);

   }
La fonction dj_month_format() me sert à afficher le mois en français.

Je pense pas que ce que j'ai fait soit la meilleur solution car je vois pas comment vérifer les doublons en php.

Posté : 03 juin 2008, 01:25
par ouckileou
Directement en SQL dans ta requête ce serait un poil plus rapide et surtout plus simple. Essaie de faire ce que tu fais en PHP en SQL avec les fonctions que je t'ai données, puis regarde GROUP BY et COUNT.

Posté : 03 juin 2008, 18:45
par djtec
Donc je dois faire une requête comme ceci si j'ai bien compris
$sql = "select *, MONTH(post_time), YEAR(post_time) from ".$prefix.TABLE_POST." where post_id = '".$idtem."'";
Est-ce correct ou pas?

Et je ne comprend pas pour les GROUP BY et COUNT je dois les mettre ou et avec quelle variable?

Posté : 04 juin 2008, 09:32
par ouckileou
Est-ce correct ou pas?
Je sais pas moi, essaye déjà pour voir ce que ça donne :roll:

Pour le COUNT et le GROUP BY en fait ça te permettrait d'avoir ensuite : une ligne par mois/année avec le nombre de posts correspondant.

Posté : 04 juin 2008, 17:49
par djtec
J'ai éssayé ceci
$sql = "select MONTH(post_time), YEAR(post_time) from ".$prefix.TABLE_POST;
$req = $db->dj_query($sql);
$row = $db->dj_fetch_array($req);
echo $row[0].' '.$row[1];
Et même ceci
$sql = "select MONTH(post_time) as month, YEAR(post_time) as year from ".$prefix.TABLE_POST;
$req = $db->dj_query($sql);
$row = $db->dj_fetch_array($req);
echo $row['month'].' '.$row['year'];
Mais rien ne s'affiche.

Je ne dois pas utiliser les bonnes variables d'affichage mais je ne vois pas quelles sont ces variables.

Posté : 04 juin 2008, 18:34
par ouckileou
Comme indiqué dans les conseils de débuggage SQL/PHP, construit d'abord ta requête directement dans MySQL, avant de la passer via PHP. Là, tu multiplies les sources possibles de problèmes...

ET tu as regardé dans la doc ce que prenaient en paramètre MONTH() et YEAR() ??

Posté : 04 juin 2008, 19:49
par djtec
Donc pour MONTH() et YEAR() cela ne va pas en faites il faut que j'utilise FROM_UNIXTIME() car il faut que je change le timestamp en un format valide.

Donc j'ai fait cette requête:
$sql = "select MONTH(FROM_UNIXTIME(post_time)), YEAR(FROM_UNIXTIME(post_time)) from ".$prefix.TABLE_POST;
$req = $db->dj_query($sql) or die (mysql_error());

while ($row = $db->dj_fetch_array($req)) 
	{
		echo $row[0].'/'.$row[1];
	}
Cette requête me renvoit bien maintenant les dates comme je le désirais maintenant il reste plus qu'à éviter les doublons.

Et pour le débugage j'ai fait un echo de ma requête et il y a pas d'erreur apparament car même mysql_error() ne renvoit aucune erreur.

Et pour GROUP BY je vois pas comment l'utiliser car apparament vus ce qui est marqué dans la doc il ne s'aplique pas sur MONTH() ou YEAR() mais que sur des variables normales.

Posté : 04 juin 2008, 22:19
par ouckileou
Utilise des alias comme tu avais essayé précédemment, et groupe dessus

Posté : 04 juin 2008, 22:34
par djtec
Voici ma requête actuelle et elle fonctionne parfaitement:
$sql = "select distinct MONTH(FROM_UNIXTIME(post_time)) as month, YEAR(FROM_UNIXTIME(post_time)) as year from ".$prefix.TABLE_POST." group by month desc";
$req = $db->dj_query($sql) or die (mysql_error());

while ($row = $db->dj_fetch_array($req)) 
    {
		$tpl->assign_block_vars('arcrow', array(
			'DATE' => dj_month_format($row[0]).' '.$row[1]
		));
    }
Mais par contre quand je met quand j'essaye de mettre COUNT() la j'ai une erreur sql.

Voici le message d'erreur:
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'distinct MONTH(FROM_UNIXTIME(post_time)) as month, YEAR(FROM_UNIXTIME(post_time)' at line 1
J'ai beau essayé de mettre COUNT() avant ou après le DINSTINCT j'ai toujours la même erreur.

Posté : 04 juin 2008, 22:58
par ouckileou
On peut voir la requête que tu essaies pour avoir cette erreur ? Et comme tu as lu les conseils de débuggage tu nous donneras bien le SQL généré, pas celui avec les variables PHP.

Le message d'erreur te suggère de regarder la doc, c'est un bon conseil, suis le.

COUNT compte les lignes, en fait tu n'as pas besoin du DISTINCT si tu veux connaître le nombre de messages postés chaque mois.

Posté : 04 juin 2008, 23:13
par djtec
J'utilise DISTINCT pour éviter les doublons.

Voici la requête:
select count(*), MONTH(FROM_UNIXTIME(post_time)) as month, YEAR(FROM_UNIXTIME(post_time)) as year from test_post group by month desc
Pour que count() fonctionne je dois retirer distinct