Classer des sujets d'un forum en PHP

Vraiment j’y arrive pas ! 
Je souhaite modifier le classement des sujets de mon forum, pour les ordonner par date de la dernière réponse (comme celui de Cafzone). J’utilise PHP et MySQL.
La table du forum contient les champs suivants :

  • id : identifiant
  • id_sujet : identifiant du sujet
    - cat : 0 c’est un sujet 1 c’est une réponse
  • date : le ##/##/## à ##h##

Actuellement c’est classé par ordre de postage du sujet. Voici la requête :
SELECT * WHERE cat=‘0’ ORDER by ID DESC

On ne peut que utiliser les id pour classer par ordre chronologique car les dates ne sont pas au format DATE dans MySQL.

Merci beaucoup

Ce message a été édité par lorant le 05/07/2003

Je pense avoir une solution (je suis qu’un modeste codeur en PHP, donc à prendre avec des pincettes )

Tu crées un nouveau champ dans ta database que tu nommes ‘class’ par exemple.

Lorsque quelqu’un poste un message dans le sujet 5 par exemple, tu dis de rajouter 1 à la valeur du class du sujet (qui est 0 si c’est le premier message avec ce systeme …)

Ensuite, à chaque fois que quelqu’un poste un message, tu cherches la plus grande valeur du champ ‘class’ des sujets (SELECT where cat=‘0’ order by class DESC 0,1 ), et tu lui ajoutes 1. La valeur obtenue remplacera l’ancienne valeur du champ ‘class’ du sujet dans lequel le message a été posté.

Ainsi tu peux classer par ‘class’ les sujets, et tu as ainsi les sujets classés par dernier message posté.

En effet, mais pour tous les anciens messages du forum, ça ne marche pas.
J’ai essayer avec des if, des SELECT DISTINCT ou autres, et rien ! Je crois que avec cette table ce n’est pas possible.

Peut être qu’en utilisant des tableaux ? mais je sais pas du tout comment ça marche et si c’est possible.

Petit rajout : pour un sujet id = id_sujet si ça peut aider !
Et merci pijOniC

Evidemment le script n’agit que pour les nouveaux messages … J’avais pas pensé que t’avais déjà des données dans ta database. Ben là je peux pas t’aider, désolé.

Ta date est elle stockée exactement comme l’exemple que tu nous as donné ? C’est à dire une chaine de caractères [VARCHAR en SQL] ?

As tu déjà entendu parlé des timestamp unix et/ou SQL ?

Oui la date est vraiment comme le l’ai écrite… mais de toutes façons ça n’aurait rien changé : classer par date ou id c’est pareil…

Mais j’ai trouvé la solution ! Eureka !!
J’ai repris la solution proposée, de créer un nouveau champs qui serait remplis uniquement pour les sujets, et qui contient l’ID de la dernière réponse (id_dernier). Comme on classe les sujets comme ça :
SELECT * FROM table WHERE ordre=‘0’ ORDER by id_dernier DESC

Reste le problème pour actualiser les sujets existants dans la table. Ben voici la solution :

  • je sélectionne dans la table tous les sujets
  • je sélectionne l’id du dernier message correspondant au sujet
  • je remplis le champs id_dernier du sujet avec le résultat ci-dessus

Et voilà la table mise à jour !
Reste plus qu’à chaque message posté, de mettre à jour id_dernier du sujet par une requête toute simple comme proposée par pijOniC.

Bah mais c’est ignoble Tu fais un champ lastpostdate dans ta table threads qui est un datetime qui est mis a jour a chaque nouveau post post dans un thread et tu fais un ORDER BY lastpostdate DESC et basta…

C’est très bien comme idée sauf que la date doit être au format adapté dans MySQL (ce qui n’est pas le cas), donc j’utilise les ID.
Ensuite ta solution marche uniquement avec les nouveaux messages et moi je veux garder les anciens messages du forum.
Donc étape obligée : créer un script pour mettre à jour tout les sujets existants, puis après ça se fera à chaque post comme tu l’as dit (mais avec l’ID).

Et ça marche très bien. Non mais !

PHP sait lire les dates et les classer selon un ordre? Nan parce que moi j’avais cette solution en tête vu que j’ai toujours utilisé que des ids.

Et pis c’est sûr que si c’est GloP qui s’y colle … c’est plus la même chose

Oui on peut classer les dates. Mais pour cela il faut que dans la table (MySQL) elles soient au format datetime et non char ou varchar. Elles sont inscrites comme ça 2003-07-06 ce qui permet de les classer par ordre de grandeur, puis on peut les mettre dans un autre ordre pour l’affichage sur les pages web ex : 06/07/2003.

Enfin je crois que c’est comme ça, car j’ai jamais utilisé ce système…

Ah ok … Ben c’est pas bien d’utiliser des dates au format char alors !

ARGH mais une date au format VARCHAR OU CHAR c’est la peine de mort direct. Interdiction de base de donnee pendant 5 ans et fouettage du cadavre. Le truc immonde quoi. Une date c’est une DATE ou alors un DATETIME. Point barre. Et classer par les ID pour en fait classer par date c’est MAL™ aussi (mais moins, juste la grosse fessee pour ca).

[quote]- date : le ##/##/## à ##h##[/quote]Tu veux dire que ton champs “date” contient par exemple “le 06/07/2003 à 15h00” ???

ARGHHHH, rassure-moi tu n’as jamais fait d’études d’info de gestion non ?

Bon, alors vire moi ce champs et remplace le par un datetime qui va bien, parce que ça c’est tout simplement ignoble !!!

Kai Kai Kai !!!

Oui oui, la date est bien comme ça… dans un champs CHAR.
Mais j’aimerai bien avoir une révision de ma peine à la baisse, j’ai une petite excuse…

Ce forum je l’ai fais il y a un certains temps et à ce moment là je connaissais quelques trucs en PHP et presque rien en BDD. J’ai jamais assisté à des cours de prog ou d’info (si ce n’est les cours de Word et d’exel du bahut, où la plupart du temps on dort tellement c’est basique). Ce que je connais je l’ai appris petit à petit quand j’en ai besoin, suite à des erreurs, à des recherches sur Internet, en feuilletant des bouquins.

Et donc DATE ou DATETIME pour moi ça servait à rien. (Aïe, pas la fessée !)
Je le sais depuis un certain temps maintenant, mais comme je veux garder les messages existants (et avec un peu de flemme) j’ai jamais modifié.

Mais promis : je le ferai plus jamais !

Ben tu fais un script d’export pour passer tes champs date char (c mal) en champs date, et wala

Ok.
Mais comment changer l’ordre de la date avant de la rentrer dans le nouveau champs DATETIME ? C’est à dire de 06/07/2003 19:46:00 à 2003/07/06 19:46:00 ?

Ce message a été édité par lorant le 07/07/2003

Fais un tour du côté de l’utilisation des expressions régulières en PHP, en particulier la fonction ereg()

Edit : (il est 5h45 et je vais me coucher juste après)
Par exemple,

ereg( “le ([0-9]{2})/([0-9]{2})/([0-9]{4}) à ([0-9]{2}):[0-9]{2}):[0-9]{2})” , $lechampDATEaffreuxenCHAR,
$regs)

Et hop, tout est dans $regs. Pour faire ton timestamp, il suffit ensuite de dire
$lechampDATEquilestbeau = 0;
$lechampDATEquilestbeau = $lechampDATEquilestbeau + $regs[3]; # AAAA
$lechampDATEquilestbeau = $lechampDATEquilestbeau * 100 + $regs[2]; # MM
$lechampDATEquilestbeau = $lechampDATEquilestbeau * 100 + $regs[1]; # JJ
$lechampDATEquilestbeau = $lechampDATEquilestbeau * 100 + $regs[4]; # HH
$lechampDATEquilestbeau = $lechampDATEquilestbeau * 100 + $regs[5]; # MM
$lechampDATEquilestbeau = $lechampDATEquilestbeau * 100 + $regs[6]; # SS

et voilà, ton timestamp est prêt à être mis à jour dans la base…

P.S.: Il y a sûrement plus beau, mais là je fais le porcasse, mes yeux se ferment…

Ce message a été édité par xentyr le 08/07/2003

Ok j’ai compris.
Merci beaucoup !

J’essaierai ce soir en rentrant…

Y’a un moyen si tu veux garder ton champs “non date”.

/* déclaration du tab contenant les dates triées */ $tabDate = array(); /* requête qui te permet de ramener tes champs (ici, le champ date ...) */ $sql = "SELECT date " $sql.= "FROM ta_table"; /* Execution */ $result = mysql_query($sql) or die(mysql_error()); /* Pour chaque date, on prend la partie numérique, on la met dans ce sens : aaaammjjhhmm. on met le résultat dans un tableau */ $i=1; while($fields = mysql_fetch_array($result)) {    preg_match(  "|les(dd?)/(dd?)/(ddd?d?)sàs(dd?)h(dd?)|i",  $fields["date"],   $match);  $tabDate[$i] = $match[3].$match[2].$match[1].$match[4].$match[5];   $i++; } /* on trie le tableau du plus grand au plus petit */ rsort($tabDate); /* à l'affichage tu retrouves toutes tes dates triées de la plus récente à la plus ancienne */ while(list($key, $value) = each($tabDate)) {   echo $value.""; }

voilà voilà, c’est un peu barbare, mais bon, quelle idée de prendre un champ char pour une date ^^ si t’as un soucis, tu pe me mailer à neokenny@aol.com ++ Osiris

[c0unt0 Edit : Si Glop nous a fait un style ““C++”” (bien mal nomme en cette ocasion ) : c’est pour qu’on s’en serve, surtout pour un example, et meme si a l’arrive le chose va finir tout sur une seulle ligne parce que c’est du php/javascript/whatever", hey bah ca reste super plus mieux lisible comme ca ) ]

Ce message a été édité par c0unt0 le 17/07/2003

Désolé, je suis sous mozilla, et apparememnt, ça déconne …
Je l’avais ps mis sur une seule ligne (suis pas bête qd meme ^^)

++
Osiris