> Tous les forumsForum des Webmasters

 Tri dans un tableauSujet résolu
Statut du sujet : RESOLU Imprimer
 nico3009
  Posté le 26/07/2008 @ 13:00  
 Petit astucien

114 Messages

Bonjour,

je souhaite faire des tris dans un tableau de la manière suivante:

J'ai les en-tête :

Pseudo - Points - Buts pour - Buts contre - Diff

et je récupère avec des echo les variables :

$joueur1a - $pointsjoueur1a - $butspourjoueur1a - $butscontrejoueur1a - $diffjoueur1a

$joueur2a - $pointsjoueur2a - $butspourjoueur2a - $butscontrejoueur2a - $diffjoueur2a ....

Je veux faire le tri par Points, puis par Diff, puis par Buts pour, puis pas Pseudo.

Pouvez-vous donc m'expliquer quelle est la fonction qui permet de faire ce tri?

Merci

 Afficher le profil de nico3009Envoyer un message privé à nico3009
 
 
Publicité
 Malcolm  Posté le 26/07/2008 à 14:35  
  Astucien


7270 Messages

Si possible, fais ton tri via SQL, c'est bcp plus simple rapide, ça prend moins de ressources et tu auras directement ce que tu veux.

ORDER BY points DESC, Diff DESC, Buts DESC, Pseudo ASC par exemple.

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 26/07/2008 à 18:00  
Petit astucien

114 Messages

Ben en fait ces variables proviennent de calculs et non pas dans des tables sql. Apparemment il existe une fonction SORT. Il ne faudrait pas que je regarde par là?

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 28/07/2008 à 23:11  
  Astucien


7270 Messages

Re,

oui, mais comment pourras-tu associer ton tri à ce qu'il signifie réellement ? (parmi les 4 nombres, comment sauras-tu lequel correspond à tel prénom ...)

il faut voir du côté des tableaux, ss doute, asort(), arsort, array_ksort(), etc, mais tu risques vite de tomber dans des tableaux imbirqués, ce qui te complexifiera la tâche ...

T'as pas moyen de stocker ces valeurs dans une table et de faire les calculs et tris via SQL ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 28/07/2008 à 23:57  
Petit astucien

114 Messages

Je pense en effet que tu as raison. Je voulais que les calculs se fassent sans manipulation mais là, je n'ai pas trop le choix.

J'ai donc créé une table sql "classall" avec pour champs pseudo - points - butspour - butscontre - diff

comment je peux insérer mes variables :

$joueur1a - $pointsjoueur1a - $butspourjoueur1a - $butscontrejoueur1a - $diffjoueur1a

$joueur2a - $pointsjoueur2a - $butspourjoueur2a - $butscontrejoueur2a - $diffjoueur2a...

d'un seul bloc?

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 29/07/2008 à 18:36  
  Astucien


7270 Messages

Re,

tout simplement par $req = "INSERT INTO classall (pseudo, points, butspour, butscontre, diff) VALUES ('".$joueur1a."', '".$pointsjoueur1a."', '".$butspourjoueur1a."', '".$butscontrejoueur1a."', '".$diffjoueur1a."');";

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 05/08/2008 à 22:50  
Petit astucien

114 Messages

salut,

désolé du temps de réponse mais j'étais un peu débordé

Bon, je n'arrive pas à faire fonction cet "insert"

Je l'ai placé de la manière suivante :

>>>

$diffjoueur9a = $butspourjoueur9a-$butscontrejoueur9a;
$diffjoueur10a = $butspourjoueur10a-$butscontrejoueur10a;

$req_classall = "INSERT INTO classall (pseudo, points, butspour, butscontre, diff) VALUES ('".$joueur1a."', '".$pointsjoueur1a."', '".$butspourjoueur1a."', '".$butscontrejoueur1a."', '".$diffjoueur1a."');";
};

?>

<<<<<

soit juste avant la fin du out de script en php

J'ai fait un echo de $req_classall et ça me retourne :

>>> INSERT INTO classall (pseudo, points, butspour, butscontre, diff) VALUES ('j1', '10', '8', '9', '-1'); <<<<

Le contenu de VALUES est cependant correct...

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 05/08/2008 à 23:22  
  Astucien


7270 Messages

Où est-ce que tu exécutes la requête ? Quel message d'erreur as-tu ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 06/08/2008 à 16:53  
Petit astucien

114 Messages

Je l'ai placée dans le fichier où je récupère tous mes résultats ($points..., $butspour....). Après je n'ai pas de message d'erreur mais simplement rien qui n'arrive dans ma table.

Est-ce que ça peut venir du fait que toutes mes variables ($points..., $butspour....)étaient déjà calculées avant que je n'insère ma ligne de requête?

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 nico3009  Posté le 07/08/2008 à 15:20  
Petit astucien

114 Messages

Ca y est, je me suis dépatouillé

En fait je faisais un echo pour vérifier que ma requête était bonne et elle l'était, mais je n'avais pas pensé à en faire un pour vérifier si il n'y avait pas un problème avec ma table. J'ai donc fait :

$mysqlresult = mysql_query($req_classall) or die('ERREUR '.$req_classall.' '.mysql_error());
echo $mysqlresult;

et là j'ai eu en retour :

ERREUR INSERT INTO classall (pseudo, points, butspour, butscontre, diff) VALUES ('j1', '10', '8', '9', '-1'); Duplicate entry 'j1' for key 1

et en réfléchissant un peu j'ai compris que j'avais mis "pseudo" en clé primaire au lieu de le mettre en index. Du coup, comme je récupérais plusieurs résultats du même pseudo, il ne l'acceptait pas.

Merci à toi Malcom en tous cas de m'avoir aidé

Allez je vais féter ça !!

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 nico3009  Posté le 08/08/2008 à 16:08  
Petit astucien

114 Messages

Ah ben non j'ai toujours un souci

J'ai rajouté une ligne pour insérer les scores de 2 joueurs, ce qui donne :

$req_classall1 = "INSERT INTO classall (pseudo, points, butspour, butscontre, diff) VALUES ('".$joueur1a."', '".$pointsjoueur1a."', '".$butspourjoueur1a."', '".$butscontrejoueur1a."', '".$diffjoueur1a."');";


$req_classall2 = "INSERT INTO classall (pseudo, points, butspour, butscontre, diff) VALUES ('".$joueur2a."', '".$pointsjoueur2a."', '".$butspourjoueur2a."', '".$butscontrejoueur2a."', '".$diffjoueur2a."');";

et il n'insère uniquement que les cariables du 1er joueur!!!

La structure de ma table est :

Champs : pseudo (varchar50), points (varchar2), butspour (varchar2), butscontre (varchar2), diff (varchar2)

et l'index est pseudo en type "index"

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 nico3009  Posté le 09/08/2008 à 10:13  
Petit astucien

114 Messages

Bon, finalement j'ai trouvé grâce à une petite recherche sur le net :

$req_classall = "INSERT INTO classall VALUES ('".$joueur1a."', '".$pointsjoueur1a."', '".$butspourjoueur1a."', '".$butscontrejoueur1a."', '".$diffjoueur1a."'), ('".$joueur2a."', '".$pointsjoueur2a."', '".$butspourjoueur2a."', '".$butscontrejoueur2a."', '".$diffjoueur2a."');";

et là ca marche !

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 09/08/2008 à 13:18  
  Astucien


7270 Messages

si tu définis 2 req_classall (req_classall1, req_classall2) il faut faire 2x mysql_query ...

Bravo pour les déductions précédentes en tous cas, elles étaient bien fondées et tout à fait appropriées.

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 12/08/2008 à 15:10  
Petit astucien

114 Messages

Pour faire mon tri, j'ai préféré faire un fichier à part. Je n'arrive cependant pas à faire le tri.

Si je le fais directement dans ma base de données, ça marche. Mais là non.

Voici le script :

<?php

$hostname = "";
$user = "";
$password = "";
$nom_base_donnees = "";

mysql_connect($hostname, $user, $password) or die(mysql_error());
mysql_select_db($nom_base_donnees);


$query = "SELECT * FROM classall ORDER BY points DESC, diff DESC, butspour DESC, pseudo ASC";
$result = mysql_query($query);

?>

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 12/08/2008 à 19:27  
  Astucien


7270 Messages

comment fais-tu le tri à partir de ton fichier ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 12/08/2008 à 21:20  
Petit astucien

114 Messages

avec ces 2 lignes en fait :

$query = "SELECT * FROM classall ORDER BY points DESC, diff DESC, butspour DESC, pseudo ASC";
$result = mysql_query($query);

Dans la 1ere ligne, je demande que $query soit égal à un tri par points décroissant...

et dans la 2ème je demande que la requête s'exécute dans toute la table.

Du moins c'est ce que je veux et je pense faire.

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 13/08/2008 à 00:30  
  Astucien


7270 Messages

Pour la base de données / MySQL ok, et tu as dit plus haut que ça marchait ... Mais quelles opérations effectues-tu pour le fichier ? parce que mysql_query c'est pas pour lire dans un fichier ...

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 13/08/2008 à 00:53  
Petit astucien

114 Messages

J'aurais peut etre dû utiliser mysql_fetch_array alors.

Mais, m'est-il possible de faire le tri au moment de l'insertion? (de cette manière en fait)

$req_classall = "INSERT INTO classall VALUES
('".$joueur1a."', '".$pointsjoueur1a."', '".$butspourjoueur1a."', '".$butscontrejoueur1a."', '".$diffjoueur1a."'),
('".$joueur2a."', '".$pointsjoueur2a."', '".$butspourjoueur2a."', '".$butscontrejoueur2a."', '".$diffjoueur2a."'),
('".$joueur3a."', '".$pointsjoueur3a."', '".$butspourjoueur3a."', '".$butscontrejoueur3a."', '".$diffjoueur3a."'),
('".$joueur4a."', '".$pointsjoueur4a."', '".$butspourjoueur4a."', '".$butscontrejoueur4a."', '".$diffjoueur4a."'),
('".$joueur5a."', '".$pointsjoueur5a."', '".$butspourjoueur5a."', '".$butscontrejoueur5a."', '".$diffjoueur5a."'),
('".$joueur6a."', '".$pointsjoueur6a."', '".$butspourjoueur6a."', '".$butscontrejoueur6a."', '".$diffjoueur6a."'),
('".$joueur7a."', '".$pointsjoueur7a."', '".$butspourjoueur7a."', '".$butscontrejoueur7a."', '".$diffjoueur7a."'),
('".$joueur8a."', '".$pointsjoueur8a."', '".$butspourjoueur8a."', '".$butscontrejoueur8a."', '".$diffjoueur8a."'),
('".$joueur9a."', '".$pointsjoueur9a."', '".$butspourjoueur9a."', '".$butscontrejoueur9a."', '".$diffjoueur9a."'),
('".$joueur10a."', '".$pointsjoueur10a."', '".$butspourjoueur10a."', '".$butscontrejoueur10a."', '".$diffjoueur10a."')

ORDER BY points DESC, diff DESC, butspour DESC, pseudo ASC;";

$mysql_result = mysql_query($req_classall) or die('Erreur SQL !<br>'.$req_classall.'<br>'.mysql_error());

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 nico3009  Posté le 13/08/2008 à 14:15  
Petit astucien

114 Messages

Bon, j'ai essayé d'avancer un peu (mais je nage complet)

J'ai déjà remonté mysql_query au niveau de l'insertion ce qui donne :

$req_classall = mysql_query("INSERT INTO classall VALUES
('".$joueur1a."', '".$pointsjoueur1a."', '".$butspourjoueur1a."', '".$butscontrejoueur1a."', '".$diffjoueur1a."'),
('".$joueur2a."', '".$pointsjoueur2a."', '".$butspourjoueur2a."', '".$butscontrejoueur2a."', '".$diffjoueur2a."'),
('".$joueur3a."', '".$pointsjoueur3a."', '".$butspourjoueur3a."', '".$butscontrejoueur3a."', '".$diffjoueur3a."'),
('".$joueur4a."', '".$pointsjoueur4a."', '".$butspourjoueur4a."', '".$butscontrejoueur4a."', '".$diffjoueur4a."'),
('".$joueur5a."', '".$pointsjoueur5a."', '".$butspourjoueur5a."', '".$butscontrejoueur5a."', '".$diffjoueur5a."'),
('".$joueur6a."', '".$pointsjoueur6a."', '".$butspourjoueur6a."', '".$butscontrejoueur6a."', '".$diffjoueur6a."'),
('".$joueur7a."', '".$pointsjoueur7a."', '".$butspourjoueur7a."', '".$butscontrejoueur7a."', '".$diffjoueur7a."'),
('".$joueur8a."', '".$pointsjoueur8a."', '".$butspourjoueur8a."', '".$butscontrejoueur8a."', '".$diffjoueur8a."'),
('".$joueur9a."', '".$pointsjoueur9a."', '".$butspourjoueur9a."', '".$butscontrejoueur9a."', '".$diffjoueur9a."'),
('".$joueur10a."', '".$pointsjoueur10a."', '".$butspourjoueur10a."', '".$butscontrejoueur10a."', '".$diffjoueur10a."');");

et ensuite j'ai rajouté :

$query = "SELECT * FROM classall ORDER BY points DESC, diff DESC, butspour DESC, pseudo ASC";
$classement = mysql_fetch_array($query);
$result = mysql_query($classement) or die ("Classement a échoué");

et j'obtiens ce message :

Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource ....Classement a échoué

Mon objectif pour l'instant est d'afficher dans ma table les variables triées.

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 13/08/2008 à 21:29  
  Astucien


7270 Messages

pour répondre à ta première question : non. L'INSERT INTO ne fait qu'insérer des valeurs, il n'a pas connaissance des valeurs déjà présentes dans la table donc il ne peut pas faire d'opérations.

pour ta 2è question, il faut faire ça en 3 étapes.

1. $query="SELECT ...."; (ça tu as bon)

2. $answer = mysql_query($query); (ça tu l'as oublié)

3. $data = mysql_fetch_array($answer); (ça c'est bon, mais tu ne peux faire un fetch_array que sur une réponse d'un mysql_query ...)

Plus d'infos : Utiliser mysql avec PHP

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 13/08/2008 à 22:58  
Petit astucien

114 Messages

Ca ne marche toujours pas, j'ai toujours ce message :

<b>Warning</b>: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in <b>/mnt/167/sdb/e/d/masterprono/allgroupea.php</b> on line <b>814</b><br />

J'ai donc fait des echo :

Pour $query, ca me retourne : SELECT * FROM classall ORDER BY points DESC, diff DESC, butspour DESC, pseudo ASC

Pour $answer : Resource id #24

Pour $data : Array

Le problème est donc situé à $answer. Je pense cependant à une chose : quand j'ai fais cette requête de tri directement dans ma table, elle a marché mis à part que j'ai dû changer le type des nombres au niveau de la structure. Ils étaient en varchar et je les ai mis en tinyint ou un truc dans le genre.

Ne faut-il pas également que je change le type de ma variable pseudo qui est en varchar?

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 13/08/2008 à 23:49  
  Astucien


7270 Messages

non. Quand tu fais un tri, ASC ou DESC, ça triera soit par ordre croissant ou décroissant (puisque c'est ce qui est demandé) s'il s'agit d'un nobre, quel que soit son type (int, bigint, tinyint, float, double) soit par ordre alphabétique ou ordre alphabétique inverse s'il s'agit de texte.

Que l'echo $answer te mette un resource id#XXX est tout à fait normal.

Fais un print_r($data) et tu verras (ça se lit mieux dans le code source) ce que contient ce tableau exactement.

si mysql_fetch_array retourne une erreur, c'est que $answer n'est pas bon. Tu fais bien un mysql_fetch_array sur $answer, lui-même résultant d'un mysql_query de ta requête ?

La requête est-elle correctement exécutée sous PHPMyAdmin ?

Suggestion : affiche l'erreur mysql ...

$answer = mysql_query($query) or die($query."<br />\n".mysql_error());

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 14/08/2008 à 10:09  
Petit astucien

114 Messages

Le print_r($data); me retourne ceci :

Array
(
[0] => j4
[pseudo] => j4
[1] => 13
[points] => 13
[2] => 5
[butspour] => 5
[3] => 3
[butscontre] => 3
[4] => 2
[diff] => 2
)

ce qui est bien le score le plus élevé. Par contre il me retourne uniquement cette ligne.

Pour le message d'erreur "warming..." c'est réglé, c'était une erreur de syntaxe dans la parenthèse.

Si je reprends, la requête a l'air de s'exécuter (mais uniquement sur la 1ere ligne) mais le tri ne se fait pas dans ma table sql (à l'affichage)

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 14/08/2008 à 14:16  
  Astucien


7270 Messages

As-tu lu mon article sur php et mysql ? JE pense que ton souci vient de là, mysql doit retourner plusieurs lignes, et avec PHP tu dois les lire l'une après l'autre ...Or tu ne lis que la dernière arrivée, qui a écrasé toues les autres.

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 19/08/2008 à 13:47  
Petit astucien

114 Messages

Bon voilà, tout est réglé

En fait, il s'agit d'un tableau à 2 dimensions d'après ce que j'ai compris. J'ai donc stocké mes variables dans un tableau ($tab) et après je n'ai qu'à l'interroger pour l'affichage. Ce qui donne :

$query = "SELECT * FROM classall ORDER BY points DESC, diff DESC, butspour DESC, pseudo ASC";
$tab = array() ;
$answer = mysql_query($query);
$i = 0;
While ($ligne = mysql_fetch_array($answer))
{
For ($j=0; $j<count($ligne);$j++)
{
$tab[$i][$j] = $ligne[$j];
}
$i++ ;
}

Ce n'est pas moi qui ai trouvé ça tout seul (merci Sébastien ) mais c'est très efficace

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
Haut de la page 
Inscrivez-vous !
- Posez vos questions

- Résolvez vos problèmes

- Aidez les autres

- Participez et créez vos discussions

- Dialoguez en privé avec d'autres membres

- Suivez vos sujets préférés

- Affichez les signatures des membres

TOUT EST GRATUIT !

Je crée mon compte




Vous avez besoin d'aide ?
Des centaines d'experts sont à votre disposition sur les forums PC Astuces pour vous aider gratuitement, 24h/24, 7j/7.

Les derniers sujets résolus !
 

 > Tous les forumsForum des Webmasters

 
Forum PC Astuces© 1997-2008 WebastucesAller en haut de la page