Tri décroissant, fonctions sort() / rsort() ne fonctionnent pas [Résolu]

Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
- - Dernière réponse : payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
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
Afficher la suite 

Votre réponse

18 réponses

Meilleure réponse
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Tonio_35
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
3
Merci
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

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 98 internautes nous ont dit merci ce mois-ci

Commenter la réponse de Tonio_35
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
0
Merci
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
Commenter la réponse de Tonio_35
Messages postés
197
Date d'inscription
mardi 20 janvier 2004
Dernière intervention
20 février 2013
0
Merci
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
Commenter la réponse de cs_47
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
0
Merci
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
Commenter la réponse de Tonio_35
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
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
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
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
Commenter la réponse de payetonju
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
0
Merci
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
Commenter la réponse de Tonio_35
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
pardon j'ai oublié dans mon copié collé :
$DateAjout = $data['DATE_INSCRIPTION'];
$LogAjout = $data['LOGIN'];
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
ce sont justement mes lignes 204 et 205
Commenter la réponse de payetonju
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
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)
Commenter la réponse de payetonju
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
0
Merci
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
Commenter la réponse de Tonio_35
Messages postés
3708
Date d'inscription
lundi 5 juillet 2004
Dernière intervention
27 avril 2012
0
Merci
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 -
Commenter la réponse de kohntark
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
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é :(
Commenter la réponse de payetonju
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
0
Merci
Mais quel curieux ce kohntark... Et quelle bienveillance...

_________________________________
Min iPomme
Commenter la réponse de Tonio_35
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
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
Commenter la réponse de payetonju
Messages postés
567
Date d'inscription
mercredi 4 octobre 2006
Dernière intervention
30 août 2011
0
Merci
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
Commenter la réponse de Tonio_35
Messages postés
437
Date d'inscription
mercredi 26 septembre 2007
Dernière intervention
2 juillet 2014
0
Merci
Oui c'est vrai ! Mais je dirais surtout merci Codes Sources xD
Commenter la réponse de payetonju

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.