Se connecter avec
S'enregistrer | Connectez-vous

[PHP] Classement

Dernière réponse : dans Programmation
Expert Programmation

Bonjour,

Je suis en train de faire un classement de plusieurs championnat, mais je coince sur 2 choses

Voici la totalité de la page classement:
  1. <?php
  2.  
  3. require ('config.php');
  4. mysql_connect ("$host", "$user", "$pass");
  5. mysql_select_db ("$bdd");
  6.  
  7. $championnat_id = mysql_real_escape_string(htmlspecialchars($_GET['championnat_id']));
  8.  
  9. $req = mysql_query ("SELECT tag FROM championnat WHERE id = '$championnat_id'");
  10. $rep = mysql_fetch_array($req);
  11. $championnat_tag = $rep['tag'];
  12.  
  13. mysql_close();
  14.  
  15. ?>
  16.  
  17. <h3>Classement de la [<?php echo $championnat_tag; ?>]</h3>
  18. <div class="block">
  19. <table width="100%" cellpadding="0" cellspacing="Ø">
  20. <tr>
  21. <td width="5%">#</td>
  22. <td width="45%">Equipe</td>
  23. <td width="5%">J</td>
  24. <td width="5%">G</td>
  25. <td width="5%">N</td>
  26. <td width="5%">P</td>
  27. <td width="5%">BP</td>
  28. <td width="5%">BC</td>
  29. <td width="10%">Diff</td>
  30. <td width="10%">Point</td>
  31. </tr>
  32.  
  33. <?php
  34. /////////////////////////////////////////////////////
  35. // AFFICHAGE DU CLASSEMENT
  36. /////////////////////////////////////////////////////
  37.  
  38. require ('config.php');
  39. mysql_connect ("$host", "$user", "$pass");
  40. mysql_select_db ("$bdd");
  41.  
  42. $rang = 1;
  43.  
  44. $equipe = mysql_query ("SELECT * FROM equipes WHERE championnat_id = '$championnat_id'");
  45. while ($rep_equipe = mysql_fetch_array($equipe)) {
  46. $equipe_id = $rep_equipe['id'];
  47. $equipe_championnat_id = $rep_equipe['championnat_id'];
  48. $equipe_nom = $rep_equipe['nom'];
  49.  
  50. $nbr_gagner_dom = mysql_query ("SELECT COUNT(*) AS nbr_match_gagner_dom FROM `match` WHERE equipe1_id = '$equipe_id' AND score_equipe1 > score_equipe2 AND championnat_id = '$equipe_championnat_id'");
  51. while ($res_nbr_gagner_dom = mysql_fetch_array($nbr_gagner_dom)) {
  52. $nbr_match_gagner_dom = $res_nbr_gagner_dom['nbr_match_gagner_dom'];
  53.  
  54. $nbr_gagner_ext = mysql_query ("SELECT COUNT(*) AS nbr_match_gagner_ext FROM `match` WHERE equipe2_id = '$equipe_id' AND score_equipe2 > score_equipe1 AND championnat_id = '$equipe_championnat_id'");
  55. while ($res_nbr_gagner_ext = mysql_fetch_array($nbr_gagner_ext)) {
  56. $nbr_match_gagner_ext = $res_nbr_gagner_ext['nbr_match_gagner_ext'];
  57.  
  58. $nbr_nul = mysql_query ("SELECT COUNT(*) AS nbr_match_nul FROM `match` WHERE equipe1_id = '$equipe_id' OR equipe2_id = '$equipe_id' AND score_equipe1 = score_equipe2 AND championnat_id = '$equipe_championnat_id'");
  59. while ($res_nbr_nul = mysql_fetch_array($nbr_nul)) {
  60. $nbr_match_nul = $res_nbr_nul['nbr_match_nul'];
  61.  
  62. $nbr_perdu_dom = mysql_query ("SELECT COUNT(*) AS nbr_match_perdu_dom FROM `match` WHERE equipe1_id = '$equipe_id' AND score_equipe1 < score_equipe2 AND championnat_id = '$equipe_championnat_id'");
  63. while ($res_nbr_perdu_dom = mysql_fetch_array($nbr_perdu_dom)) {
  64. $nbr_match_perdu_dom = $res_nbr_perdu_dom['nbr_match_perdu_dom'];
  65.  
  66. $nbr_perdu_ext = mysql_query ("SELECT COUNT(*) AS nbr_match_perdu_ext FROM `match` WHERE equipe2_id = '$equipe_id' AND score_equipe2 < score_equipe1 AND championnat_id = '$equipe_championnat_id'");
  67. while ($res_nbr_perdu_ext = mysql_fetch_array($nbr_perdu_ext)) {
  68. $nbr_match_perdu_ext = $res_nbr_perdu_ext['nbr_match_perdu_ext'];
  69.  
  70. $nbr_but_pour_dom = mysql_query ("SELECT SUM(score_equipe1) AS nbr_but_pour_dom FROM `match` WHERE equipe1_id = '$equipe_id' AND championnat_id = '$equipe_championnat_id'");
  71. while ($res_nbr_but_pour_dom = mysql_fetch_array($nbr_but_pour_dom)) {
  72. $nbr_but_pour_dom = $res_nbr_but_pour_dom['nbr_but_pour_dom'];
  73.  
  74. $nbr_but_pour_ext = mysql_query ("SELECT SUM(score_equipe2) AS nbr_but_pour_ext FROM `match` WHERE equipe2_id = '$equipe_id' AND championnat_id = '$equipe_championnat_id'");
  75. while ($res_nbr_but_pour_ext = mysql_fetch_array($nbr_but_pour_ext)) {
  76. $nbr_but_pour_ext = $res_nbr_but_pour_ext['nbr_but_pour_ext'];
  77.  
  78. $nbr_but_contre_dom = mysql_query ("SELECT SUM(score_equipe1) AS nbr_but_contre_dom FROM `match` WHERE equipe2_id = '$equipe_id' AND championnat_id = '$equipe_championnat_id'");
  79. while ($res_nbr_but_contre_dom = mysql_fetch_array($nbr_but_contre_dom)) {
  80. $nbr_but_contre_dom = $res_nbr_but_contre_dom['nbr_but_contre_dom'];
  81.  
  82. $nbr_but_contre_ext = mysql_query ("SELECT SUM(score_equipe2) AS nbr_but_contre_ext FROM `match` WHERE equipe1_id = '$equipe_id' AND championnat_id = '$equipe_championnat_id'");
  83. while ($res_nbr_but_contre_ext = mysql_fetch_array($nbr_but_contre_ext)) {
  84. $nbr_but_contre_ext = $res_nbr_but_contre_ext['nbr_but_contre_ext'];
  85.  
  86. $nbr_match_gagner = $nbr_match_gagner_dom + $nbr_match_gagner_ext;
  87. $nbr_match_perdu = $nbr_match_perdu_dom + $nbr_match_perdu_ext;
  88. $nbr_but_pour = $nbr_but_pour_dom + $nbr_but_pour_ext;
  89. $nbr_but_contre = $nbr_but_contre_dom + $nbr_but_contre_ext;
  90. $nbr_diff = $nbr_but_pour - $nbr_but_contre;
  91. $nbr_point = ($nbr_match_gagner * 3) + $nbr_match_nul;
  92. $nbr_match_jouer = $nbr_match_gagner + $nbr_match_nul + $nbr_match_perdu;
  93.  
  94. if ($nbr_diff > 0) {
  95. $calcul_diff = "+$nbr_diff";
  96. } else {
  97. $calcul_diff = $nbr_diff;
  98. }
  99.  
  100. array_multisort($nbr_point, SORT_NUMERIC, SORT_DESC);
  101.  
  102. echo "
  103.  
  104. <tr>
  105. <td>$rang.</td>
  106. <td><a href=\"?page=equipe&equipe_id=$equipe_id\">$equipe_nom</a></td>
  107. <td>$nbr_match_jouer</td>
  108. <td>$nbr_match_gagner</td>
  109. <td>$nbr_match_nul</td>
  110. <td>$nbr_match_perdu</td>
  111. <td>$nbr_but_pour</td>
  112. <td>$nbr_but_contre</td>
  113. <td>$calcul_diff</td>
  114. <td>$nbr_point</td>
  115. </tr>
  116.  
  117. ";
  118.  
  119.  
  120. $rang++;
  121.  
  122. }}}}}}}}}}
  123.  
  124. mysql_close();
  125.  
  126. ?>
  127.  
  128. </table>
  129. </div>


Tout fonctionne sauf le nombre de match nul je n'arrive pas a comparer les 2 tables score_equipe1 et score_equipe2 alors que j'ai réussi avec > et < pour les match gagner ou perdu mais == ne fonctionne pas.

Mon deuxième problème c'est que je dois classer les équipes par $nbr_point mais cette variable ne vient pas d'une requête SQL je ne peux donc pas faire ORDER BY...

Merci de votre aide =)

Autres pages sur : php classement

Lassé par la pub ? Créez un compte
Expert Programmation

Comme je te l'avais dit la dernière fois, quand tu fais des COUNT() et que ça ne te retourne qu'une seule valeur, tu n'as pas besoin de faire de while. Un if suffit, et pas besoin d'imbriquer toutes les requêtes.

Et sinon, comme crazycat, bien trop de requêtes.
Expert Programmation

@Crazycat:

  1. CREATE TABLE IF NOT EXISTS `match` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `championnat_id` varchar(255) COLLATE utf8_unicode_ci NOT NULL,
  4. `equipe1_id` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
  5. `equipe2_id` varchar(3) COLLATE utf8_unicode_ci NOT NULL,
  6. `score_equipe1` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
  7. `score_equipe2` varchar(2) COLLATE utf8_unicode_ci NOT NULL,
  8. PRIMARY KEY (`id`)
  9. )


Se sont juste les champ minimum pour pouvoir faire le classement hors des matchs.

@OmaR: Oui je sais pour le while mais que je fasse une boucle ou une condition, ce n'est pas pareil? Si je n'imbrique pas je n'ai qu'un affichage...

Je suis obligé de faire autant de requête, ou alors il sera préférable de créer une table classement?
Expert Programmation

Tu peux faire une seule requête et ensuite travailler avec le recordset.

La requête principale serait du genre:
  1. SELECT m.*, e1.name, e2.name, c.*
  2. FROM `match` m
  3. JOIN `equipes` e1 ON (e1.id = m.equipe1_id)
  4. JOIN `equipes` e2 ON (e2.id = m.equipe2_id)
  5. JOIN `championnat` c ON (c.id=m.championnat_id)
  6. WHERE (
  7. m.championnat_id=".$_GET['championnat_id']."
  8. )


A partir de là, tu peux obtenir un bon gros tableau associatif en PHP qui ne fera pas exploser ta base. Et tes calculs pourront être fait directement en php.
Expert Programmation

allstar27 a dit :
@OmaR: Oui je sais pour le while mais que je fasse une boucle ou une condition, ce n'est pas pareil? Si je n'imbrique pas je n'ai qu'un affichage...

Ta première boucle qui boucle sur toutes les équipes, faut la garder évidemment, mais les autres pas besoin, vu que tu n'auras qu'un seul résultat.

Dans tous les cas, il vaut mieux faire le moins de requêtes possibles, comme expliqué par crazycat
Expert Programmation

@crazycat: Ca à l'air très complexe et j'avoue que je n'y comprend pas grand chose à ton bout de code...

Je crois que je vais créer une table classement et incrémenterais à la validation d'un match =/
Lassé par la pub ? Créez un compte
Tom's guide dans le monde