spamyx Posté 25 Avril 2006 Posté 25 Avril 2006 Bonjour, Je suis webmaster dun site de tournoi en ligne sur le jeu vidéo de football PES 5 et jaimerais créer une rubrique STATS en exploitant les fonctions de calcul de Mysql et PHP. Je m'explique... Je veux utiliser le système de base de données Mysql couplé à PHP pour : 1/ Après chaque match joué , je rentre le score du match dans ma base de données (table Match) et mon site se met à jour dynamiquement ( ex : le joueur1 gagne 2-0 contre le joueur2 donc les stats de victoires de joueur1 augmentent dans son profil) 2/ Une page duel qui permettrait de comparer les résultats entre 2 joueurs grâce à la base de données Match sur cette forme là : http://img64.imageshack.us/my.php?image=duel5jg.gif Voici les tables que je pense utiliser pour ma base de données avec leur principaux champs : Mes questions sont : 1/ Quelle est la meilleure stratégie pour un tel projet ? Est ce que mes bases sont bien construites ou doit je faire plus simple (évitez les doublons ?) ? 2/ Comment gérer les calculs dans Mysql, notamment pour calculer si le nombre de Victoires ou Défaites (du style : si score1>score2 alors Victoire pour joueur1 et défaite pour Joueur2) et afficher les résultats sur une page de cette manière là : affichage résultats par joueur : http://img512.imageshack.us/img512/7204/player8jj.gif affichage résultats par duel : http://img64.imageshack.us/my.php?image=duel5jg.gif En espérant que vous ayez compris mes problèmes. Je débute en php et sql, jai donc bcp de questions mais je suis motivé par ce projet donc si quelquun peux maider dans ma démarche, au moins en me donnant le résonnement à utiliser pour faire un tel projet... Merci...
Sarc Posté 25 Avril 2006 Posté 25 Avril 2006 Bonjour, C'est sympa un post documenté, plein de jolies pratiques petites images Pour la peine, je vais répondre... Dans ta base de données, une règle (pour moi importante) est de ne pas faire allusion à une autre table par des champs texte ! Par exemple, vu que tu as une table joueur, dans les autres tables, quand tu indiques le vainqueur, tu ne dois pas mettre le nom du joueur mais son ID unique. Pourquoi ? Parce qu'il est super simple d'avoir des problèmes de noms, les accents, apostrophes, etc.. sont autant de moyens de créer des doublons de joueurs ! Idem pour les équipes, tu les rajoutes dans ta bdd si jamais tu en utilises une nouvelle (par exemple si quelqu'un a la drôle d'idée d'essayer de gagner avec le PSG à PES...) Sinon, pas grand chose à redire au niveau de tes tables. Pour engendrer le tableau de scores, tu as deux possibilités : Créer une table pour ça, et la modifier à chaque match, en ajoutant directement le nombre de buts marqués, buts pris, 3 points, etc... Soit, autre possibilité, refaire tous les calculs en PHP à chaque affichage du tableau final. La deuxième méthode est pratique si jamais tu fais une faute de frappe, tu n'as pas besoin de tout rechanger comme dans la première méthode... Mais elle utilise un peu plus de ressources BDD. Enfin, pour le nombre de matchs qu'il y a, les calculs en PHP se feront tout seul ! En tout cas pour quelqu'un qui débute, tu as l'air assez organisé : continue comme ça, pense bien à ta structure avant de commencer le site, et surtout sois rigoureux dans tes champs de formulaire, on se perd souvent dans des formulaires trop compliqués... Si tu as d'autres questions (documentées ) n'hésite pas ! EDIT : oups, j'oubliais : bienvenue sur le hub
spamyx Posté 28 Avril 2006 Auteur Posté 28 Avril 2006 (modifié) C'est sympa un post documenté, plein de jolies pratiques petites images Oui merci c'est mon côté webdesigner créatif qui ressort ! J'ai bossé un peu sur mon organisation de tables et pour éviter toutes erreurs de saisie (noms, apostrophes etc...) et comme chaque joueur peut avoir plusieurs équipes par tournoi, je pense créer 4 tables, la table Match ayant des clés étrangères : Table Joueur : ID | Nom| Prenom | Pseudo | Nationalité| Table Equipe : ID | Nom | Match ID | Tournoi_ID | Joueur1_ID |Equipe1_ID | Score1 |Score2 | Equipe2_ID | Joueur2_ID | Tournoi ID | Nom | Jeux | Date | Chaque joueur peut avoir plusieurs équipes dans un même tournoi ( ex : le joueur1 à Lyon, PSG dan sle tournoi 01 puis il a OM et Rennes dans le tournoi 02) Maintenant mon gros problème réside dans les calculs en php, je ne vois vraiment pas comment écrire une telle requête. Sarc, Peux tu être plus précis quand tu me dis "Soit, autre possibilité, refaire tous les calculs en PHP à chaque affichage du tableau final". Disons que je pense avoir compris la structure des tables sql mais je bloque dans le calcul des resultats : comment faire comprendre à la BDD que si score1>score2 alors le joueur1 à une Victoire et joueur2 à une défaite. Faut il faire une sorte de compteur qui s'incrémenterait à chaque saisie du résultat dans la table matchs???? Et le plus important pour moi ce sont les calculs de DUELS entre joueurs et là je vois vraiment pas le code php... Jsuis un peu perdu là... Merci de m'aider... en attendant je continue à m'organiser.. et je pars en vacances a+ Modifié 28 Avril 2006 par spamyx
Sarc Posté 28 Avril 2006 Posté 28 Avril 2006 Re-bonjour, Justement, avec cette méthode, ta base de données ne fait rien. De toute façon, une base de données, c'est passif, son rôle c'est pas de réfléchir, c'est de collecter toutes tes données. Après, avec les SELECT, tu pourras sélectionner tous les matchs du tournoi, et en PHP, faire les calculs nécessaires. Tu auras par exemple if ($score1>$score2) $points[$id_joueur] += 3; elseif ($score1==$score2) $points[$id_joueur] ++; Après, ce sont des utilisations de tableaux en PHP que tu dois savoir faire, avec utilisation éventuellement de classes (enfin, abstiens toi aux tableaux dans un premier temps), et puis après un affichage en parcourant tes tableaux... Je peux pas non plus tout te faire, il faut que tu sois plus précis dans tes questions : commence par savoir comment rentrer une info dans la bdd avec un formulaire, puis comment reselectionner les infos qui te sont utiles, puis de les stocker dans un tableau, puis de pouvoir faire des modifications dessus ! Bonne chance
spamyx Posté 28 Avril 2006 Auteur Posté 28 Avril 2006 (modifié) OK donc en fait je ne vais pas utiliser SQL pour "faire des calculs" donc va falloir que je commence à étudier le PHP en profondeur... Voici le plan de combat si j'ai bien compris : 1/ rentrer une info dans la bdd avec un formulaire :ex saisir les cores dans la table Match avec une requête INSERT ? 2/selectionner les infos dans la bdd : ex lister le nombre de matchs entre joueur1 et joueur2 requête SELECT c çà ? 3/stocker les infos utiles : c'est ici qu'il faut utiliser les tableaux php? 4/ traiter ces infos : en ecrivant des fonctions de calculs en php avec des conditions (if) ... puis afficher le resultats de ce traitement d'infos. Pour le pt 1/ et 2/ je pense avoir saisit la logique. As tu des liens qui montre des exemples faciles pour ces 4 points. Autre question, dans certains cas un joueur peut etre "joueur1" et devenir "joueur2" la fois d'apres (dans la table Match). Est ce que c'est possible de gérer cela dans le traitement des resultats ou faut il que je rentre le score tjrs dans le même ordre avec les joueurs? merci PS : je débute vraiment en php donc désolé pour tant de questions mais jsuis motivé donc... Crois tu vraiment que ce projet est réalisable par un newbie en programmation ? Modifié 28 Avril 2006 par spamyx
Sarc Posté 28 Avril 2006 Posté 28 Avril 2006 Bien sûr que ce projet est réalisable par un débutant en PHP, avec du temps, de la patience, de l'énergie, un peu de jugeotte... Tu sais, pitimonde est un de mes premiers projets, si ce n'est le premier En gros tu as raison pour ton plan de combat, du moins c'est ce que je ferais ! Tu peux regarder dans les post its du Hub les principaux sites où tu pourras apprendre le PHP + Sql facilement. Sur PHPdebutant.org tu auras de bons exemples par exemple, ou lesiteduzero plaît à pas mal de gens également. Pour la gestion des tableaux, tu t'en fiches de savoir s'il est joueur 1 ou joueur 2, tu auras des variables avec chacun des joueurs, et que ce soit le résultat 1 qui gagne, ou le résultat 2, importe peu, c'est grâce à un tableau du genre $points[$joueur] que tu contrôleras tout ça, donc que ce soit le joueur 1 ou le joueur 2, tu auras $joueur qui aura l'ID du membre et tout ira. Enfin, lance toi doucement dans tout ça tout de même
spamyx Posté 28 Avril 2006 Auteur Posté 28 Avril 2006 Bon alors si tu penses que ce projet est realisable je vais m'y mettre à fond. C'est vrai que le site du zéro est pas mal rédigé je trouve... En fait pour bien débuter, je veux juste savoir si mes tables sont bien construites pour pouvoir afficher les résultats que je veux (cf images du post 1) 1) affichage des résultats par joueur et par tournoi sous forme de tableau 2/affichage des resultats par duel de joueurs (joueur 1 vs joueur2) Sinon, tu parlais d'une certaine lenteur pour les ressources BDD à cause de nbreux calculs : il faut savoir que j'ai plus de 1000 enregistrements de scores à rentrer (sont sur Excell)... tu crois que çà tiendra le choc ? merci encore a+ en espérant qiue je pourrais compter sur ton aide en cas de blocage...
captain_torche Posté 28 Avril 2006 Posté 28 Avril 2006 Ne t'inquiètes pas pour tes ressources : si tu indexes les bons champs, tu ne devrais pas avoir de souci.
spamyx Posté 1 Juin 2006 Auteur Posté 1 Juin 2006 de retour sur mon projet... Et je me rends compte que c'est très compliqué ces langages SQL, php pour un pauvre webdesigner comme moi... Mais je ne desespère pas et j'ai donc avancé sur mes bases SQL : Voici les principales tables avec leurs principaux champs : TABLE Joueur : id / nom / surnom / description / photo / coeff TABLE Equipe id/ nom / flag TABLE Tournoi id/ nom / jeux / date TABLE Elimination (ex :poule, 1/4 finale, 1/2 etc) id/ nom TABLE Matchs : (dans cette table ya que des chiffres ) id/ tournoi_id / joueur_id / equipe1_id / score1 / score2 / equipe2_id / joueur2_id / elimination_id La TABLE Matchs étant la clé de la Matrice car il ya plusieurs clés étrangères... Etape 1) créer des formulaires pour entrer les données dans les tables correspondantes : J'ai utiliser Dreamweaver et ses formulaires d'insertion d'enregistrement (pas mal fait je trouve) et j'ai un problème -déjà- pour insérer des données dans ma table MATCHS. J'ai réussi à faire çà : mon problème c'est pour les champs equipe2_id et pour joueur2_id : il ne s'affichent pas alors que c'est les mêmes valeurs que pour equipe1_id et pour joueur1_id et ces champs eux s'affichent bien (ex : Manchester United)... Quelqu'un à une idée ??? Voici le code Dreamweaver sur le champ equipe2_id du formulaire.... <select name="equipe2_id"> <?php do { ?> <option value="<?php echo $row_Rs_equipe['id']?>" ><?php echo $row_Rs_equipe['nom']?></option> <?php} while ($row_Rs_equipe = mysql_fetch_assoc($Rs_equipe));?> </select> Faut il Merci pour l'éclaircissemnt... Je commence à comprendre la logique SQL mais je redoute l'Etape 2 et l'aspect calcul de victoires défaites par joueurs en php.... je crois que je vais en faire des cauchemards
spamyx Posté 4 Juin 2006 Auteur Posté 4 Juin 2006 personne a une idée pour mon problème de jointure de ma table MATCHS ? En fait tous vient de là... et je me demande si elle est vraiment bien construite cette table?
Bourinho Posté 5 Juin 2006 Posté 5 Juin 2006 (modifié) Je crois que ton problème vient du fait que tu as déjà "vidé" $Rs_equipe (avec les mysql_fetch_assoc du premier menu déroulant). Ce que je te conseillerais de faire (ça ne doit pas être la solution optimale mais c'est déjà un début.) $Rs_equipe1=mysql_query($TaRequete);$Rs_equipe2=$Rs_equipe1; et ensuite : <select name="equipe1_id"> <?phpdo { ?> <option value="<?php echo $row_Rs_equipe['id']?>" ><?php echo $row_Rs_equipe['nom']?></option> <?php} while ($row_Rs_equipe = mysql_fetch_assoc($Rs_equipe1));?> </select><select name="equipe2_id"> <?phpdo { ?> <option value="<?php echo $row_Rs_equipe['id']?>" ><?php echo $row_Rs_equipe['nom']?></option> <?php} while ($row_Rs_equipe = mysql_fetch_assoc($Rs_equipe2));?> </select> Je ne suis pas sur de ce que j'avance mais à mon humble avis, c'est une bonne piste... Par contre, il y a un truc qui me chagrine, c'est le do {...} while (...) parce que à la la première boucle, que vaut ton $row_Rs_equipe['id']??? Ca posera certainement un problème avec la solution que je te propose... Mais si cela fonctionne, tant mieux! Ce que je pense, c'est que ce do{...}while(...) permet d'avoir une case vide par défaut (sans nom d'équipe...). A mon avis, la case par défaut dans ton second menu déroulant sera la dernière équipe de ta table... Mais ce sera un problème facile à résoudre si jamais c'est le cas... Modifié 5 Juin 2006 par Bourinho
spamyx Posté 5 Juin 2006 Auteur Posté 5 Juin 2006 effectivement le problème peut venir de là... L'exemple que j'ai donné se basait sur un formulaire (par dreamweaver) qui doit me servir à insérer les matchs (du type : joueur1 à gagné 3 -0 contre joueur2). Donc pour commencer il faudrait déjà que j'arrive à lire les données de ma base matchs et c'est çà le problème. Voici ma requête (du moins celle qui devrait m'afficher la liste des matchs) : <?php require_once('Connections/pesonfire.php'); ?><?phpmysql_select_db($database_pesonfire, $pesonfire);$query_liste_matchs = "SELECT joueur.nom_joueur, equipe.nom_equipe, matchs.score1, matchs.score2, tournoi.nom_tournoi, elimination.nom_elimination FROM joueur, equipe, matchs, tournoi, elimination WHERE matchs.joueur1_id=joueur.id and matchs.equipe1_id=equipe.id and matchs.elimination_id=elimination.id and matchs.tournoi_id=tournoi.id";$liste_matchs = mysql_query($query_liste_matchs, $pesonfire) or die(mysql_error());$row_liste_matchs = mysql_fetch_assoc($liste_matchs);$totalRows_liste_matchs = mysql_num_rows($liste_matchs); Cette requête m'affiche les resulats des matchs de la forme : nom_joueur / nom_equipe / score 1/ score2 / nom_tournoi / nom_elimination DONC ma jointure semble juste sauf que je n'arrive pas à JOINDRE les "joueur2_id", "equipe2_id" de la table MATCHS avec le "joueur.id" de la table JOUEUR et le "equipe.id" de la table EQUIPE.... Si quelqu'un peut me "débloquer" sur l'affichage de ma table MATCHS je pense que je pourrais avancer un peu plus mais là je vois pas pourquoi je n'arrive pas à "afficher" les noms des joueur2 et equipe2... PS :je rappelle que je suis debutant en php sql et que j'utilise Dreamweaver 8 pour codé... Merci
Bourinho Posté 5 Juin 2006 Posté 5 Juin 2006 (modifié) En fait, tu peux lire différemment ta base de données suivant ce que tu veux faire... Donne nous plus d'info sur ce que tu veux afficher ou faire avec les résultats... Si tu veux afficher un tableau du type nom_joueur1 / nom_equipe1 / nom_joueur2 / nom_equipe2 / score 1/ score2 / nom_tournoi / nom_elimination je te propose un lien qui va te permettre de résoudre ton problème... Modifié 6 Juin 2006 par Bourinho
Bourinho Posté 6 Juin 2006 Posté 6 Juin 2006 (modifié) Allez, c'est cadeau de la maison (en fait, ton problème m'intéressait beaucoup car je risque de le rencontrer dans peu de temps ) $query_liste_matchs = "SELECT J1.nom_joueur, E1.nom_equipe, J2.nom_joueur, E2.nom_equipe, matchs.score1, matchs.score2, tournoi.nom_tournoi, elimination.nom_elimination FROM joueur AS J1, equipe AS E1, joueur AS J2, equipe AS E2, matchs, tournoi, elimination WHERE matchs.joueur1_id=J1.id and matchs.equipe1_id=E1.id and matchs.joueur2_id=J2.id and matchs.equipe2_id=E2.id and matchs.elimination_id=elimination.id and matchs.tournoi_id=tournoi.id"; En fait, l'astuce, c'est d'appeler la même table dans deux "alias" différents (c'est ce que je fais avec les AS)...ce qui fait que tu peux l'utiliser comme deux tables indépendantes.... Je ne sais pas si cela peut marcher tel quel, mais la piste à suivre est celle là je pense!!!! Modifié 6 Juin 2006 par Bourinho
spamyx Posté 6 Juin 2006 Auteur Posté 6 Juin 2006 (modifié) Effectivement çà marche, j'arrrive enfin à lister mes données de la table matchs. Merci bcp, même si j'avais commencer à me pencher de plus pres sur les alias de TABLE grâce à un autre collègue de FORUM (merci Mintiell ) et donc merci Bourinho ! Bon çà c'est une chose mais voilà maintenant que l'on passe aux choses sérieuses : 1/ insérer les données dans la table MATCHS grâce à un formulaire d'insertion d'enregistrements. As tu une idée sur la chose? Car j'ai essayé sous Dreamweaver (cf post précdent) mais j'ai je n'arrive toujours pas à afficher les equipe2_id et joueur2_id..... 2/ voilà les pages que je cherche à faire avec toutes ces données de la table matchs (j'ai illustrer mes pages pour que vous compreniez mes envies) PAGE : STATS JOUEURS : une page pour chaque joueur regroupant toutes ces statistisques par tournoi : PAGE : STATS DUELS : on selectionne 2 joueurs et cela affiche leurs stats lors de leur affrontements PAGE : RECORDS : affiche tous les records de joueur à battre pour un tournoi (meilleur attaque, meilleur défense...) En gros : ce que je veux c'est que je puisse rentrer un résultat dans ma table MATCHS sous une forme simple (et non pas par phpadmin avec des 0/1/2/0 ) puis que mes pages se mettent à jour dynamiquement ( çà c'est le vrai objectif!) Donc voilà, je pense qu'il y a du boulot mais je ne sais pas comment et par où commencer avec les requ^tes.... En espérant que mes pages-vignettes soit lisibles .... a+ je l'espère... Modifié 6 Juin 2006 par spamyx
Bourinho Posté 6 Juin 2006 Posté 6 Juin 2006 Salut à toi, je pense que je vais finir par faire le design de ton site à ce rythme .Plus sérieusement, 1/ insérer les données dans la table MATCHS grâce à un formulaire d'insertion d'enregistrements. As tu une idée sur la chose? Car j'ai essayé sous Dreamweaver (cf post précdent) mais j'ai je n'arrive toujours pas à afficher les equipe2_id et joueur2_id..... As-tu testé ce que je t'ai proposé au message #11 pour que ton second menu propose bien les equipes et les joueurs disponibles??? Sinon, pour insérer tes données dans ta table match, faut que tu choisisses une page cible pour ton formulaire... et dans cette page, avec des $_POST, tu récupères les choix de l'internaute (comme page, t'en fais une jolie qui prévient ton internaute que son formulaire a bien été envoyé à la base de données blablablabla). Ensuite, tu insères ces $_POST dans la table avec une requête de type INSERT ... INTO ... . Conseil : ne prends pas directement les valeurs de tes $_POST dans tes requêtes pour une question de sécurité (fais une REGEX ou un htmlentities...) 2/ voilà les pages que je cherche à faire avec toutes ces données de la table matchs (j'ai illustrer mes pages pour que vous compreniez mes envies) Je vais essayer de voir ce que je peux faire ce soir si personnne ne l'a déjà fait... il est 9:20 et faut que j'y vais Si ce que je t'ai expliqué ressemble à du chinois...vas faire un tour sur ce premier tutorial et sur ce second tutorial.
Bourinho Posté 7 Juin 2006 Posté 7 Juin 2006 (modifié) Bon, allez, c'est parti, pour ton premier tableau : $queryVictoireR = "SELECT tournoi.nom_tournoi, COUNT(*) AS NbMatchs, NbMatchs AS NbVictoires, 0 AS NbNuls, 0 AS NbDefaites, SUM(matchs.score1) AS NbButP, SUM(matchs.score2) AS ButsC, 0 AS finFROM matchs, tournoiWHERE (matchs.joueur1_id=$IdJoueur AND matchs.score1>Reception.score2)GROUP BY tournoi.nom_tournoi";$queryVictoireD = "SELECT tournoi.nom_tournoi, COUNT(*) AS NbMatchs, NbMatchs AS NbVictoires, 0 AS NbNuls, 0 AS NbDefaites,SUM(matchs.score2) AS NbButP,SUM(matchs.score1) AS NbButsC, 0 AS finFROM matchs, tournoiWHERE (matchs.joueur2_id=$IdJoueur AND matchs.score2>Reception.score1)GROUP BY tournoi.nom_tournoi";$queryDefaiteR = "SELECT tournoi.nom_tournoi, COUNT(*) AS NbMatchs, 0 AS NbVictoires, 0 AS NbNuls, NbMatchs AS NbDefaites, SUM(matchs.score1) AS NbButP,SUM(matchs.score2) AS NbButsC,max(elimination.id) AS finFROM matchs, tournoi, eliminationWHERE (matchs.joueur1_id=$IdJoueur AND matchs.score2>Reception.score1 AND matchs.elimination_id=elimination.id)GROUP BY tournoi.nom_tournoi";$queryDefaiteD = "SELECT tournoi.nom_tournoi, COUNT(*) AS NbMatchs, 0 AS NbVictoires, 0 AS NbNuls, NbMatchs AS NbDefaites, SUM(matchs.score2) AS NbButP,SUM(matchs.score1) AS NbButsC,max(elimination.id) AS finFROM matchs, tournoi, eliminationWHERE (matchs.joueur2_id=$IdJoueur AND matchs.score1>Reception.score2 AND matchs.elimination_id=elimination.id)GROUP BY tournoi.nom_tournoi";$queryNul = "SELECT tournoi.nom_tournoi, COUNT(*) AS NbMatchs, 0 AS NbVictoires, NbMatchs AS NbNuls, 0 AS NbDefaites, SUM(matchs.score1) AS NbButP, NbButP AS NbButsC,max(elimination.id) AS finFROM matchs, tournoi, eliminationWHERE (matchs.joueur2_id=$IdJoueur AND matchs.score1>Reception.score2 AND matchs.elimination_id=elimination.id)GROUP BY tournoi.nom_tournoi";$query="$queryVictoireR UNION $queryVictoireD UNION $queryDefaiteR UNION $queryDefaiteD UNION $queryNul"$queryjenpeuplu= "SELECT tournoi.nom_tournoi, SUM(NbMatchs) AS NbMa, SUM(NbVictoires) AS NbVi, SUM(NbNuls) AS NbNu, SUM(NbDefaites) AS NbDe, SUM(NbButP) AS NbBP , SUM(NbButsC) AS NbBC, max(fin) AS ElimFROM ($query)GROUP BY tournoi.nom_tournoi" Je ne sais pas si cela marche tel quel mais je pense que c'est une bonne base... Edit : Les UNION, ça permet de mettre les différentes requêtes dans le même "tableau"... et le dernier GROUP BY est là pour mettre les nuls, victoires et défaites qui on eut lieu dans le même tournoi sur une même ligne...enfin normalement Edit2 : Ca pourrait certainement être très intéressant de toujours mettre le vainqueur en Joueur1 dans ta table match... A mon avis, y a moyen de gagner beaucoup en rapidité... Et si ça se trouve, la requête serait, ...comment dire...plus digeste!!!! Edit3 : T'as pensé au cas des pénaltys ou des prolongations??? Ca risque de te poser problème à un moment ou à un autre...(Pour un match du genre Italie Allemagne!!!) Modifié 7 Juin 2006 par Bourinho
spamyx Posté 7 Juin 2006 Auteur Posté 7 Juin 2006 (modifié) ouahh je vais battre des longueur de requêtes avec çà ! Je n'ai pas encore essayer ce que tu proposes mais je vais my plonger très rapidement maaintenant que j'ai réussi ENFIN à faire un formulaire d'insertion dans ma table MATCHS . Après des heures de bidouillage, j'y suis arrivé (je sais c'est bête mais je suis fièr de moi ). Voici mon code si çà intéresse : (juste le code du formulaire) <form id="form1" name="form1" method="POST" action="<?php echo $editFormAction; ?>"> <table width="600" border="1"> <tr> <th width="77" scope="col">tournoi_id</th> <th width="256" scope="col">joueur1_id</th> <th width="35" scope="col">equipe1_id</th> <th width="35" scope="col">score1</th> <th width="35" scope="col">score2</th> <th width="35" scope="col">equipe2_id</th> <th width="35" scope="col">joueur2_id</th> <th width="40" scope="col">elimination_id</th> </tr> <tr> <td><select name="tournoi_id" id="tournoi_id"> <?phpdo { ?> <option value="<?php echo $row_rs_tournoi['id']?>"><?php echo $row_rs_tournoi['nom_tournoi']?></option> <?php} while ($row_rs_tournoi = mysql_fetch_assoc($rs_tournoi)); $rows = mysql_num_rows($rs_tournoi); if($rows > 0) { mysql_data_seek($rs_tournoi, 0); $row_rs_tournoi = mysql_fetch_assoc($rs_tournoi); }?> </select></td> <td><select name="joueur1_id" id="joueur1_id"> <?phpdo { ?> <option value="<?php echo $row_rs_joueur_nom['id']?>"><?php echo $row_rs_joueur_nom['nom_joueur']?></option> <?php} while ($row_rs_joueur_nom = mysql_fetch_assoc($rs_joueur_nom)); $rows = mysql_num_rows($rs_joueur_nom); if($rows > 0) { mysql_data_seek($rs_joueur_nom, 0); $row_rs_joueur_nom = mysql_fetch_assoc($rs_joueur_nom); }?> </select></td> <td><select name="equipe1_id" id="equipe1_id"> <?phpdo { ?> <option value="<?php echo $row_rs_equipe['id']?>"><?php echo $row_rs_equipe['nom_equipe']?></option> <?php} while ($row_rs_equipe = mysql_fetch_assoc($rs_equipe)); $rows = mysql_num_rows($rs_equipe); if($rows > 0) { mysql_data_seek($rs_equipe, 0); $row_rs_equipe = mysql_fetch_assoc($rs_equipe); }?> </select></td> <td><input name="score1" type="text" id="score1" size="4" /></td> <td><input name="score2" type="text" id="score2" size="4" /></td> <td><select name="equipe2_id" id="equipe2_id"> <?phpdo { ?> <option value="<?php echo $row_rs_equipe['id']?>"><?php echo $row_rs_equipe['nom_equipe']?></option> <?php} while ($row_rs_equipe = mysql_fetch_assoc($rs_equipe)); $rows = mysql_num_rows($rs_equipe); if($rows > 0) { mysql_data_seek($rs_equipe, 0); $row_rs_equipe = mysql_fetch_assoc($rs_equipe); }?> </select></td> <td><select name="joueur2_id" id="joueur2_id"> <?phpdo { ?> <option value="<?php echo $row_rs_joueur_nom['id']?>"><?php echo $row_rs_joueur_nom['nom_joueur']?></option> <?php} while ($row_rs_joueur_nom = mysql_fetch_assoc($rs_joueur_nom)); $rows = mysql_num_rows($rs_joueur_nom); if($rows > 0) { mysql_data_seek($rs_joueur_nom, 0); $row_rs_joueur_nom = mysql_fetch_assoc($rs_joueur_nom); }?> </select></td> <td><select name="elimination_id" id="elimination_id"> <?phpdo { ?> <option value="<?php echo $row_rs_elimination['id']?>"><?php echo $row_rs_elimination['nom_elimination']?></option> <?php} while ($row_rs_elimination = mysql_fetch_assoc($rs_elimination)); $rows = mysql_num_rows($rs_elimination); if($rows > 0) { mysql_data_seek($rs_elimination, 0); $row_rs_elimination = mysql_fetch_assoc($rs_elimination); }?> </select></td> </tr> <tr> <td colspan="8"><div align="center"> <input type="submit" name="Submit" value="Inserer" /> </div></td> </tr> </table> <br /> <label></label> <input type="hidden" name="MM_insert" value="form1"></form> Pour répondre à ton Edit2 : j'avais effectivement prévu de classer mes resultats par joueur1 tjrs gagnant... Edit3 : concernant les prolongations ou péno ce n'est pas un problème vu que pour les stats de joueur je ne fait pas la différence avec les victoires au prolongation ou péno. Le seul problème c'est pour une victoire en finale au péno, je sais pas trop comment gérer çà. Je pense mettre peut être un champ de plus dans ma table elimination du style id 10 = victoire au péno en finale. Qu'en penses tu? Merci encore.. Modifié 7 Juin 2006 par Arlette
Bourinho Posté 7 Juin 2006 Posté 7 Juin 2006 Salut, Déjà, si tu suis l'edit2, tu peux enlever $queryVictoireD et $queryDefaiteR... Ca fait une requete moins longue et il y a peut être moyen d'en faire une plus courte...je vais me plonger sur la question ce soir...(je vais devenir un champion des requêtes!!! ) Ensuite, pour ta réponse à l'edit 3, tu veux dire que tu comptes aussi les penaltys après prolongations comme des buts??? Tu pourrais éventuellement faire des champs spéciaux pour les prolongations et les tirs au but... nom_joueur1 / nom_equipe1 / nom_joueur2 / nom_equipe2 / score 1/ score2 / scoreP1 / scoreP2 / scoreTAB1 / scoreTAB2 / nom_tournoi / nom_elimination ou les champs scoreP1 / scoreP2 / scoreTAB1 / scoreTAB2 peuvent être NULL Dis moi ce que tu en penses... PS : Ca te permettrait d'afficher un score de la façon suivante par exemple: Bourinho 2-2 (5-0 aTaB) spamyx Bourinho 3-2 aP spamyx
spamyx Posté 7 Juin 2006 Auteur Posté 7 Juin 2006 (modifié) Pour l'edit2 : Non je ne compte pas les buts marqués aux Tab dans le total ButsPour d'un joueur Dis moi ce que tu en penses... PS : Ca te permettrait d'afficher un score de la façon suivante par exemple: Bourinho 2-2 (5-0 aTaB) spamyx Bourinho 3-2 aP spamyx C'est exactement de cette manière que je vois les choses... Donc si tu peux reflechir à ce système çà me semble parfait. Ps : Concernant les scores si on parle de requête SQL çà serait plûtot Bourinho 3-0 spamyx Ps2 : si tu peux trouver une requête plus "simple" à expliquer jsuis preneur aussi ! a+ Modifié 7 Juin 2006 par spamyx
Bourinho Posté 8 Juin 2006 Posté 8 Juin 2006 (modifié) Salut, comme d'habitude, je ne suis pas sur que cela marche du premier coup, mais ça doit être une bonne base (...sql...oulala faut que j'arrête!!!) $query = "SELECT tournoi.nom_tournoi, COUNT(*) AS NbMatchs, COUNT(DISTINCT victoires.id) AS NbVictoires,COUNT(DISTINCT nuls.id) AS NbNuls, COUNT(DISTINCT defaites.id) AS NbDefaites, SUM(victoires.score1)+SUM(victoires.scoreP1)+SUM(defaites.score2)+SUM(defaites.scoreP2)+SUM(nuls.score1) AS NbButP,SUM(victoires.score2)+SUM(victoires.scoreP2)+SUM(defaites.score1)+SUM(defaites.scoreP1)+SUM(nuls.score1) AS NbButC, min(victoires.elimination_id)-1 AS finV,min(defaites.elimination_id) AS finD,FROM matchs AS victoires, matchs AS defaites,matchs AS nuls,tournoi,eliminationWHERE (victoires.joueur1_id=$IdJoueur OR defaites.joueur2_id=$IdJoueur OR nuls.joueur1_id=$IdJoueur OR nuls.joueur1_id=$IdJoueur)AND matchs.elimination_id=elimination.id AND matchs.tournoi_id=tournoi.idGROUP BY tournoi.nom_tournoi"; J'ai notamment des doutes concernant l'affichage de l'id l'élimination ... cette requête est faite pour une table elimination du genre: ID-NOM 0-Champion 1-Finale 2-Demi-finale 3-Quart de finale 4-... 5-... Normalement, ça doit pas être trop mal... Et avec ça, tu peux gérer le nom élimination "champion"... on va dire que IdPoule et l'Id d'elimination de la poule... si -1<finV<IdPoule -> IdElimination = finV sinon (ça veut dire que la derniere victoire de ce joueur a eu lieu en poule...et encore, s'il a gagné ce looser ) si finD=0 -> (ce joueur n'a pas connu de défaite (bravo)... et n'a pas connu de victoire après les poules (bouh)) IdElimination = IdPoule (car il n'a pas pu joué le tour suivant les poules...) sinon (le joueur a connu au moins une défaite) IdElimination = finD (il a été éliminé lors de sa dernière défaite...) Ce petit raisonnement (qui je l'espère est bon...) te fourni ce que tu cherches pour le cas d'une seule poule (genre pas comme la ChampionsLeague mais comme la Coupe du Monde)... mais je pense qu'il y a moyen de s'en tirer dans le cas de plusieurs poules... A+ PS : Si ton site viens à être payant... y aurait moyen de gérer l'inscription gratuite??? Modifié 8 Juin 2006 par Bourinho
spamyx Posté 8 Juin 2006 Auteur Posté 8 Juin 2006 Je pense que l'on est sur la bonne voie... enfin j'espère... j'ai essayé ta requête mais elle ne fonctionne pas : çà me met : 1064 erreur de syntaxe près de 'FROM matchs AS victoires, matchs AS defaites, matchs AS nuls, to' à la ligne 2... je comprends pas trop le passage avec WHERE, et la variable "$IdJoueur" : c'est où que tu vas la chercher ? Dans ta requête, si j'ai compris, tu ajoute les buts marqués mais comment fais tu pour calculer les Buts marqués/match par exemple ? Pour le table ELIMINATION je l'ai construite comme toi à part que je ne savais pas comment mettre la valeur "champion". PS : Merci d'avance....si t'as besoin de quelque chose en webdesign, n'hésites pas à me le demander, je te dois bien çà avec toute ton aide et ta patiente... PS2 : mon site existant sur pes : http://pesonfire.free.fr (tu vas dans la rubrique joueur et tu verras les modèles de pages que je veux réaliser dynamiquement...) a+
Bourinho Posté 8 Juin 2006 Posté 8 Juin 2006 (modifié) Salut, pour ce qui est du $IdJoueur, c'est moi qui l'ai inventé!!!! Non, en fait, je voulais que tu mettes l'id du joueur auquel on s'intéresse dedans... parce qu'on parle bien d'un joueur non??? En ce qui concerne les buts marqués et encaissés par match, je pense que c'est faisable aussi dans la requête mais faudrait déjà que celle-ci fonctionne Enfin, pour l'erreur de syntaxe, je dois bien t'avouer que je suis plutôt étonné... t'aurais pas "coupé" le nom de la table tournoi en deux par hasard??? Je disais "enfin", mais en fait, je viens de m'apercevoir d'une petite boulette dans la requête... dans le WHERE...mais aussi d'une grosse...je te mets le code moins faux... $query = "SELECTtournoi.nom_tournoi,COUNT(*) AS NbMatchs, COUNT(DISTINCT victoires.id) AS NbVictoires,COUNT(DISTINCT nuls.id) AS NbNuls,COUNT(DISTINCT defaites.id) AS NbDefaites,SUM(victoires.score1)+SUM(victoires.scoreP1)+SUM(defaites.score2)+SUM(defaites.scoreP2)+SUM(nuls.score1) AS NbButP,SUM(victoires.score2)+SUM(victoires.scoreP2)+SUM(defaites.score1)+SUM(defaites.scoreP1)+SUM(nuls.score1) AS NbButC,min(victoires.elimination_id)-1 AS finV,min(defaites.elimination_id) AS finD,FROM matchs AS victoires, matchs AS defaites,matchs AS nuls,tournoiWHERE victoires.joueur1_id=$IdJoueur AND victoires.tournoi_id=tournoi.idOR defaites.joueur2_id=$IdJoueur AND defaites.tournoi_id=tournoi.id OR (nuls.joueur1_id=$IdJoueur OR nuls.joueur2_id=$IdJoueur) AND nuls.tournoi_id=tournoi.idGROUP BY tournoi.nom_tournoi"; Je te propose qu'on essaie d'affiner par la suite...si celle là fonctionne...on devrait pouvoir s'en tirer pour tout faire! Edit : Pour l'instant, tu te tapes tout a la main????? Et tu me remercie pour ma patience...laisse moi rire quand j'imagine le temps que cq doit te prendre!!! Modifié 8 Juin 2006 par Bourinho
spamyx Posté 9 Juin 2006 Auteur Posté 9 Juin 2006 Pour l'instant, tu te tapes tout a la main????? Eh oui hélas, et c'est pour çà que je veux automatiser tout çà ! Je n'arrive pas vraiment à faire marcher ta requête. J'ai remplacer les Idjoueur par un chiffre (ex : 1) mais la requête m'affiche des resulatst totalement irréels : du genre 8 matchs, 8 victoires, 8nuls, 8 defaites, 1542 Buts Pour, 1600 BC... (j'ai que 8 enregistrements dans ma table matchs pour l'instant donc...). Je te donne ma base sql si tu veux bien essayé, çà sera plus simple pour toi... http://pesonfire.free.fr/pesonfire.sql Voici pour exemple une requête que j'ai faite qui marche pour le juste le nombre de victoire par tournoi du Joueur = 1. Par contre je n'arrive pas à tout regrouper dans une seul meme requête (avec les V, N, D etc...) SELECT Tournoi.nom_tournoi, j1.nom_joueur, count( j1.id ) AS VFROM Matchs, Joueur AS j1, Joueur AS j2, Equipe AS e1, Equipe AS e2, Tournoi, EliminationWHERE Matchs.joueur1_id = j1.id AND Matchs.joueur2_id = j2.id AND Matchs.equipe1_id = e1.id AND Matchs.equipe2_id = e2.id AND Matchs.tournoi_id = Tournoi.id AND Matchs.elimination_id = Elimination.id AND Matchs.score1 > Matchs.score2 AND Matchs.joueur1_id = 1GROUP BY Tournoi.id
Bourinho Posté 10 Juin 2006 Posté 10 Juin 2006 (modifié) Salut, $IdJoueur=1;//celui là, c'est pour l'exemple$query1 = "SELECT matchs.tournoi_id AS IDcompetition,COUNT(*) AS NbMatchs,SUM(matchs.victoire) AS NbVictoires,SUM(1-matchs.victoire) AS NbNuls,0 AS NbDefaites,SUM(matchs.score1)+SUM(matchs.scoreP1) AS NbButP,SUM(matchs.score2)+SUM(matchs.scoreP2) AS NbButCFROM matchsWHERE matchs.joueur1_id=$IdJoueurGROUP BY IDcompetition";$query2 = "SELECT matchs.tournoi_id AS IDcompetition,COUNT(*) AS NbMatchs,0 AS NbVictoires,SUM(1-matchs.victoire) AS NbNuls,SUM(matchs.victoire) AS NbDefaites,SUM(matchs.score2)+SUM(matchs.scoreP2) AS NbButP,SUM(matchs.score1)+SUM(matchs.scoreP1) AS NbButCFROM matchsWHERE matchs.joueur2_id=$IdJoueurGROUP BY IDcompetition";$queryunion="$query1 UNION $query2";$queryall="SELECT tablunion.IDcompetition AS IDcompetition, SUM(tablunion.NbMatchs) AS NbMatchs,SUM(tablunion.NbVictoires) AS NbVictoires,SUM(tablunion.NbNuls) AS NbNuls,SUM(tablunion.NbDefaites) AS NbDefaites,SUM(tablunion.NbButP) AS NbButP,SUM(tablunion.NbButC) AS NbButCFROM ($queryunion) AS tablunionGROUP BY IDcompetition";$query="SELECT *, tournoi.nom_tournoi AS competition,tablunion2.NbButP/tablunion2.NbMatchs AS NbButPPM,tablunion2.NbButC/tablunion2.NbMatchs AS NbButCPMFROM ($queryall) AS tablunion2, tournoiWHERE tournoi.id=tablunion2.IDcompetition";$reponse=mysql_query($query); ALors, qu'est ce que ça fait donc tout ça??? $query1 s'occupe du tableau match lorsque que le joueur cherché est en joueur1 $query2 s'occupe du tableau match lorsque que le joueur cherché est en joueur2 $queryunion...je te laisse deviner... $queryall...c'est pas un super nom, mais j'avais plus d'imagination...en fait, ça regroupe par IDcompetition (c'est idtournoi en quelques sortes...) $query, c'est $queryall avec la correspondance avec le nom des tournois...et non plus leur ID... Faut juste que tu rajoutes une colonne dans ta table matchs...je l'ai nommé victoire, elle vaut 1 si le match s'est terminé par une victoire, 0 si il s'est terminé par un nul (genre en poule...). Ca permet d'alléger grandement la requête et comme ça, tu fais le calcul de cette valeur une bonne fois pour toute quand tu enregistres le formulaire... Faut aussi interdire la valeur NULL pour les buts en prolongation...ca evite de faire appel à COALESCE... cela pourrait cependant être utile pour savoir combien de matchs ont été jusqu'au prolongations...C'est donc a voir! Mais y a pas grand chose à modifier au pire! Pour determiner, le moment de l'elimination...je reflechis encore un peu! Edit : Y a pas moyen de connaitre le moment de l'elimination a partir du nombre de matchs joues dans la competition tout simplement??? A+ Modifié 10 Juin 2006 par Bourinho
Sujets conseillés
Veuillez vous connecter pour commenter
Vous pourrez laisser un commentaire après vous êtes connecté.
Connectez-vous maintenant