| | 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
| | |
| |
| 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. | | | | | 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à? | | | | | 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 ? | | | | | 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? | | | | | 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."');";  | | | | | 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...
| | | | | 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 ? | | | | | 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?
| | | | | 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 !! | | | | | 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" | | | | | 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 !  | | | | | 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. | | | | | 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);
?> | | | | | Malcolm | Posté le 12/08/2008 à 19:27 | Astucien
7270 Messages
| comment fais-tu le tri à partir de ton fichier ? | | | | | 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. | | | | | 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 ... | | | | | 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()); | | | | | 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. | | | | | 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 | | | | | 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?
| | | | | 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());
| | | | | 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) | | | | | 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. | | | | | 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  | | | |
| | 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
|
|