Tri décroissant, fonctions sort() / rsort() ne fonctionnent pas

Résolu
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 - 16 mars 2010 à 15:25
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 - 18 mars 2010 à 09:23
Bonjour,

J'ai un léger souci, je voudrais afficher uniquement les 4 derniers utilisateurs inscrits sur mon site, mais je ne vosi pas trop comment faire, car que j'utilise sort() ou rsort(), ça me renvoi toujours le même tri.

Voici mon code, si quelqu'un peut m'aider :

$sql = "select LOGIN,DATE_INSCRIPTION from utilisateurs ";
$res = mysql_query($sql);
while( $data = mysql_fetch_assoc($res) )
{
  $DateAjout = $data['DATE_INSCRIPTION'];
  $LogAjout = $data['LOGIN'];

  $Inscris = array($DateAjout);
  rsort($Inscris);
  foreach ($Inscris as $key => $val)
  {
    echo "Inscrit : [" . $key . "] = " . $val . "\n";
  }
}


Merci d'avance

18 réponses

Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
17 mars 2010 à 12:03
Essai un

SELECT login, date_inscription, STR_TO_DATE(date_inscription, '%d/%m/%Y - %H:%i:%s') AS insdate FROM utilisateurs ORDER BY insdate DESC LIMIT 0,4


Pour plus de détail sur STR_TO_DATE de MYSQL : ICI
Pour plus de détail sur le format de date (%i%s...) : ICI

Celas-dis, le mieux est que tu te fasse un script php ou mysql pour convertir les données de ta base... Parce-que des formats standard c'est vraiment plus facile (Si tu veux faire des calculs par exemple : Inscrit il y a X jours).

Tu peux passer un script du genre :
UPDATE "utilisateurs" SET date_inscription = STR_TO_DATE(date_inscription, '%d/%m/%Y - %H:%i:%s');

Et convertir ta colonne en type date. Ou passer par une colonne temporaire le temps de modifer ton code PHP :
ALTER TABLE "utilisateurs" ADD new_date_ins DATETIME;
UPDATE "utilisateurs" SET new_date_ins = STR_TO_DATE(date_inscription, '%d/%m/%Y - %H:%i:%s');



_________________________________
Min iPomme
3
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
17 mars 2010 à 16:17
C'est sensible à la casse :
Si tu fais :
"SELECT login, date_inscription,...


$DateAjout = $data['date_inscription'];
$LogAjout = $data['login'];


Si tu fais
"SELECT LOGIN, DATE_INSCRIPTION,...


$DateAjout = $data['DATE_INSCRIPTION'];
$LogAjout = $data['LOGIN'];


Niveau "normalisation le premier choix avec le nom des tables en minuscule est mieux... Mais tu fais comme tu veux.

_________________________________
Min iPomme
3
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
16 mars 2010 à 15:37
Bonjour,

A quel format est ta date ?

Si c'est un timestamp tu peux utiliser un ORDER BY dans ta requête SQL. Avec la date ou les ID d'ailleurs...


_________________________________
Min iPomme
0
cs_47 Messages postés 197 Date d'inscription mardi 20 janvier 2004 Statut Membre Dernière intervention 20 février 2013 1
16 mars 2010 à 15:39
Bonjour,

s'il s'agit de juste afficher les 4 derniers utilisateurs inscrits, pourquoi ne pas le demander à la base de données directement?

du type:
select LOGIN,DATE_INSCRIPTION
from utilisateurs
order by DATE_INSCRIPTION desc
limit 0,4


bonne après midi
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
16 mars 2010 à 15:52
Au passage :

$sql = "select LOGIN,DATE_INSCRIPTION from utilisateurs ";

Normalement la norme veux qu'on mette les mot clé SQL en MAJUSCULE et le reste en minuscule.
$sql = "SELECT login, date_inscription FROM utilisateurs";


Tu n'as pas du bien comprendre le principe de ton while. Immaginons que tu ai les données suivantes :

login | date_inscription
toto  | 20100306
titi  | 20100301
tutu  | 20100101


quand tu va faire ton while, au premier passage :
$DateAjout va avoir la valeur "20100306" et $LogAjout la valeur "toto".

Ensuite tu fais $Inscris = array($DateAjout);
$Inscris auras la valeur array("20100306").
Puis tu fais
rsort($Inscris);
Donc ici tu trie un tableau d'un élèment. Il seras toujours dans l'ordre .

Pour finir tu fais ton foreach
Ca va te retourner qu'une ligne
echo "Inscrit : [" . $key . "] = " . $val . "\n";

retourneras
Inscrit : [0] = "20100306".

Puis tu repasse dans ton while une seconde fois ce qui au final t'écriras :
Inscrit : [0] = "20100301".





_________________________________
Min iPomme
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
17 mars 2010 à 09:33
Bonjour et merci pour vos réponses.
ma date est sous ce format la : 06/02/2010 - 03:56:27
(varchar)
je ne peux donc pas faire d'order by, il prend les 2 premiers chiffres uniquement pour le tri. je viens de me rendre compte que j'aurais du faire sous forme yyyymmdd mais j'ai fait tout mon site comme ça c'est un peu tard, donc j'aimerais trouver une solution pour éviter de perdre plusieurs jours à tout recommencer.

MErci pour la précision Tonio, j'ai un peu de mal avec les notions de tableau. J'ai compris mon erreur à ce niveau là, mais alors, comment puis-je les trier sachant que je ne peux aps faire de ORDER BY ni trier avec la fonction sort() ?

Merci
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
17 mars 2010 à 14:45
convertir mes colonnes de ma table ? arf non car j'ai une dizaine de table où il y a un champs de ce type et où le format est le même ça voudrait dire qu'il faut que je change plein de choses dans mes includes (entre autres) qui sont programmés en fonction de ce format là. J'ai mal commencé mais j'avoue ne pas avoir envie de refaire tout cela.

C'est pourquoi il me faut une alternative, dont j'ai besoin uniquement dans ce cas là.

sinon j'ai essayé ta requete, et ça me donne ceci comme erreur, comme si les chamsp n'existaient pas :
Notice: Undefined index: DATE_INSCRIPTION in /homepages/12/d311644604/htdocs/payetonju/www/index.php  on line 204

Notice: Undefined index: LOGIN in /homepages/12/d311644604/htdocs/payetonju/www/index.php on line 205

voici ma requete :

$sql =  " SELECT login, date_inscription, STR_TO_DATE(DATE_INSCRIPTION, '%d/%m/%Y - %H:%i:%s') AS insdate FROM utilisateurs ORDER BY insdate DESC LIMIT 0,4";
$res = mysql_query($sql) or die('Erreur SQL ! 
" '.$sql.' 
'.mysql_error());
while( $data  = mysql_fetch_assoc($res) )
{
  echo "- ".$LogAjout." inscrit(e) le ".$DateAjout."
";
}


Merci bcp tonio
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
17 mars 2010 à 15:14
C'est quoi tes lignes 204 et 205 de ton fichier index.php ?
Sinon tu ne fais pas bien ton mysql_fetch_assoc...
ton while( $data = mysql_fetch_assoc($res) )
va mettre pour chaque ligne dans ta variable $data un tableau avec toutes les colonnes récupérées dans ton SELECT...
La tu te sert de la variable $LogAjout et $DateAjout alors que tu ne les à jamais créées.

il faut se servir de $data['Nom de ta colonne désirée']...

Plus de détails ICI => LAAAAA <=
_________________________________
Min iPomme
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
17 mars 2010 à 15:22
pardon j'ai oublié dans mon copié collé :
$DateAjout = $data['DATE_INSCRIPTION'];
$LogAjout = $data['LOGIN'];
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
17 mars 2010 à 15:24
ce sont justement mes lignes 204 et 205
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
17 mars 2010 à 16:35
Carrément ça marche niquel chrome !!! MERCIIIIIIIIII
Bon maintenant que ça marche il faut que je pige comment ça marche en me documentant !
De plus, je ne savais pas que la requete SQL était sensible à la case.
Et l'ingénieur réseau qui s'occupe de moi dans la société dans laquelle je travaille m'a toujours dit de mettre tout en minuscule dans ma requete sauf les noms de colonne, pourquoi tant d'avis différents ? (ce n'est pas un ingénieur web)
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
17 mars 2010 à 19:09
Et bien disons que ton ingénieur réseau est un ingénieur réseau...

La plus part du temps (pour ne pas dire tout le temps) tu verras les requêtes SQL comme je te l'ai montré. C'est une convention. Après c'est comme tu veux. Le principal c'est de différencier les mots clé du reste... c'est juste pour faciliter la lecture...

_________________________________
Min iPomme
0
kohntark Messages postés 3706 Date d'inscription lundi 5 juillet 2004 Statut Membre Dernière intervention 27 avril 2012 30
17 mars 2010 à 23:39
Salut,

Juste un passage pour enfoncer le clou sur ça :
convertir mes colonnes de ma table ? arf non car j'ai une dizaine de table où il y a un champs de ce type et où le format est le même ça voudrait dire qu'il faut que je change plein de choses dans mes includes (entre autres) qui sont programmés en fonction de ce format là. J'ai mal commencé mais j'avoue ne pas avoir envie de refaire tout cela.

J'entends bien que tu ne souhaites pas passer du temps à tout refaire, mais tu devrais pourtant !!
Ne pas le faire tout de suite est clairement reculer pour mieux sauter, surtout que ton site n'est pas un petit site amateur (si toutefois il s'agit de celui de ton profil)
Sans procéder à la modification :
Tu vas surcharger inutilement ton serveur en utilisant des fonctions mySQL qui n'ont pas lieu d'être dans ce cas, et sans doute compenser par du code PHP inutile lui aussi.
Tu dis ne pas en avoir besoin maintenant, mais demain ??
Même si tu es retissant tu devrais au moins évaluer la charge de travail. Côté mySQL la modif ne prends que qq minutes, reste à voir côté PHP ...

ATTENTION : tu as de graves problèmes de sécurité sur ton site !!!
Je n'en dis pas plus ici et t'adresse un MP


Cordialement,


Kohntark -
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
18 mars 2010 à 09:06
Bah en fait c'est pas pour ce site là, c'est pour mon site perso, dans mon profil c'est mon site pro, mais je ne savais pas que j'avais des problemes de sécurité :(
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
18 mars 2010 à 09:12
Mais quel curieux ce kohntark... Et quelle bienveillance...

_________________________________
Min iPomme
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
18 mars 2010 à 09:15
bah heureusement qu'il est là ! moi qui n'y connais rien en failles ça m'interresserait d'en savoir plus, j'ai appris à Dev sur le tas, par moi meme lol alors si j'ai de telles lacunes ça ne m'etonne pas lol
0
Tonio_35 Messages postés 567 Date d'inscription mercredi 4 octobre 2006 Statut Membre Dernière intervention 30 août 2011 11
18 mars 2010 à 09:22
Disons que ce genre de "lacunes" vont certainement se transformer en points fort. C'est en faisant des erreurs que l'on progresse. Et surtout que l'on oublie moins ce que l'on a appris.


_________________________________
Min iPomme
0
payetonju Messages postés 436 Date d'inscription mercredi 26 septembre 2007 Statut Membre Dernière intervention 2 juillet 2014 4
18 mars 2010 à 09:23
Oui c'est vrai ! Mais je dirais surtout merci Codes Sources xD
0