> Tous les forumsForum des Webmasters

 Résultat incorrect avec conditions ternairesSujet résolu
Statut du sujet : RESOLU Imprimer
 nico3009
  Posté le 28/06/2008 @ 19:10  
 Petit astucien

114 Messages

Bonjour,

j'ai créé un site de pronostics de foot. Le script qui suit permet d'afficher les scores qu'a validé le joueur ainsi que le nombre de buts qui lui est attribué.
Au niveau des scores, tout va bien. Je récupère ses variables ("fr1", "fr2"...) dans la table "france" à partir de son pseudo.
Mon fichier "source.php" que j'ai mis en include contient entre autres les scores réels des matchs ("reel1", "reel2"...).
J'ai donc fait des conditions ternaires qui attribuent un certain nombre de buts au joueur en comparant les scores réels et ceux du joueur.
Un nombre de buts s'affiche mais ne correspond pas du tout aux conditions !!!
Je vous résume donc le barème voulu :
Le joueur saisit des scores du type "3-1" (fr1-fr2), "2-2" (fr3-fr4), "0-1"(fr5-fr6)... et le score réel est du type reel1-reel2, reel3-reel4...
- Si le score du joueur est égal au score réel, le joueur marque 2 buts.
- Si le joueur trouve le vainqueur sans trouver le score réel il marque 1 point.
- Sinon il marque 0 but.

Voici le script :

<? include ("source.php"); ?>

<?php

$hostname = "";
$user = "";
$password = "";
$nom_base_donnees = "";
$pseudo = $_POST['pseudo'];

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

$sql = "SELECT * FROM france WHERE pseudo = '".$_POST['pseudo']."'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

if ((($data['fr1'])==($reel1))&&(($data['fr2'])==($reel2))){$resultat1="2";}elseif(­(($data['fr1'])>($data['fr2']))&&(($reel1)>($reel2))){$resultat1="1";}else­if((($data['fr1'])<($data['fr2']))&&(($reel1)<($reel2))){$resultat1="1";}e­lseif((($data['fr1'])==($data['fr2']))&&(($reel1)==($reel2))){$resultat1="1";}el­se{$resultat1="0";}

if ((($data['fr3'])==($reel3))&&(($data['fr4'])==($reel4))){$resultat2="2";}elseif(­(($data['fr3'])>($data['fr4']))&&(($reel3)>($reel4))){$resultat2="1";}else­if((($data['fr3'])<($data['fr4']))&&(($reel3)<($reel4))){$resultat2="1";}e­lseif((($data['fr3'])==($data['fr4']))&&(($reel3)==($reel4))){$resultat2="1";}el­se{$resultat2="0";}

if ((($data['fr5'])==($reel5))&&(($data['fr6'])==($reel6))){$resultat3="2";}elseif(­(($data['fr5'])>($data['fr6']))&&(($reel5)>($reel6))){$resultat3="1";}else­if((($data['fr5'])<($data['fr6']))&&(($reel5)<($reel6))){$resultat3="1";}e­lseif((($data['fr5'])==($data['fr6']))&&(($reel5)==($reel6))){$resultat3="1";}el­se{$resultat3="0";}

if ((($data['fr7'])==($reel7))&&(($data['fr8'])==($reel8))){$resultat4="2";}elseif(­(($data['fr7'])>($data['fr8']))&&(($reel7)>($reel8))){$resultat4="1";}else­if((($data['fr7'])<($data['fr8']))&&(($reel7)<($reel8))){$resultat4="1";}e­lseif((($data['fr7'])==($data['fr8']))&&(($reel7)==($reel8))){$resultat4="1";}el­se{$resultat4="0";}

if ((($data['fr9'])==($reel9))&&(($data['fr10'])==($reel10))){$resultat5="2";}elsei­f((($data['fr9'])>($data['fr10']))&&(($reel9)>($reel10))){$resultat5="1";}­elseif((($data['fr9'])<($data['fr10']))&&(($reel9)<($reel10))){$resultat5="1&qu­ot;;}elseif((($data['fr9'])==($data['fr10']))&&(($reel9)==($reel10))){$resultat5="1&q­uot;;}else{$resultat5="0";}

while($data = mysql_fetch_assoc($req))
{
?>

<TABLE BORDER=1 ALIGN=CENTER>
<CAPTION><FONT SIZE="5" <FONT FACE="ARIAL"> <FONT COLOR="BLUE">FRANCE</FONT></CAPTION>

<CAPTION><FONT SIZE="4" <FONT FACE="ARIAL"> <FONT COLOR="GREEN"><? echo $data['pseudo']; ?> a pronostiqué : </FONT></CAPTION> <br />

<TR>
<TH COLSPAN="5"> SCORES </TH>
<TH ALIGN=CENTER> BUTS </TH>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra1; ?></TD></FONT> <TD><B><? echo $data['fr1']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra2; ?></TD> <TD><B><? echo $data['fr2']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat1; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra3; ?></TD></FONT> <TD><B><? echo $data['fr3']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra4; ?></TD> <TD><B><? echo $data['fr4']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat2; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra5; ?></TD></FONT> <TD><B><? echo $data['fr5']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra6; ?></TD> <TD><B><? echo $data['fr6']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat3; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra7; ?></TD></FONT> <TD><B><? echo $data['fr7']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra8; ?></TD> <TD><B><? echo $data['fr8']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat4; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra9; ?></TD></FONT> <TD><B><? echo $data['fr9']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra10; ?></TD> <TD><B><? echo $data['fr10']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat5; ?></FONT></TD>
</TR>

<TR>
<TD COLSPAN="5" ALIGN=CENTER><FONT COLOR="BLUE"><B> TOTAL BUTS </B></FONT> <TD><B><? echo ; ?></B></TD>
</TR>
</TABLE>
<?php } ?>

Merci de votre aide

 Afficher le profil de nico3009Envoyer un message privé à nico3009
 
 
Publicité
 Malcolm  Posté le 28/06/2008 à 19:23  
  Astucien


7206 Messages

ça m'a l'air Super compliqué comme écriture pour un truc aussi simple ...

Perso je ferais bcp plus simple.

- par défaut, j'initialiserais le résutat à 0 (comme ça, si jamais aucune des conditions n'est remplie, mon résultat vaudra forcément qqch, et 0 qui plus est)

- ensuite, je testerais pour voir si je dois remplacer mon 0 par défaut par 1 ou 2.

Attention au typage : même si PHP est faiblement typé, tu mets $resultat="1", ce n'est pas à 100% la même chose que $resultat = 1 ...

Je vais voir si j'ai pas une façon plus simple de rédiger ça

PS : Tu peux m'expliquer où sont les conditions ternaires ?

Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 Malcolm  Posté le 28/06/2008 à 19:33  
  Astucien


7206 Messages

Ouais, à l'aide d'une fonction PHP c'est vachement plus simple ...

J'ai pris le problème autrement, et toutes tes lignes avec les parenthèses doivent pouvoir, à la faute de syntaxe près, être remplacées par ce code :

<?php
function CalculeResultat($data1, $data2, $reel1, $reel2)
{
$resultat = 0;

// on passe tout en entier
$data1 = intval($data1);
$data2 = intval($data2);
$reel1 = intval($reel1);
$reel2 = intval($reel2);

$diff_data1 = $data2 - $data1; // si positif, $data['fr2'] > $data['fr1']
$diff_reel1 = $reel2 - $reel1; // si positif, $reel2 > $reel1


// là on trouve les scores
if (($data1 == $reel1) && ($data2 == $reel2))
{
$resultat = 2;
}
else
{
// on n'a pas les scores, mais au moins le vainqueur
if (($diff_data1 > 0) && ($diff_reel1 > 0))
$resultat = 1;

if (($diff_data1 < 0) && ($diff_reel1 < 0))
$resultat = 1;

if (($diff_data1 == 0) && ($diff_reel1 == 0))
$resultat = 1;
};

return $resultat;
};

// calcul pour les scores 1 et 2:
$resultat1 = CalculeResultat($data['fr1'], $data['fr2'], $reel1, $reel2);

// calcul pour les scores 3 et 4 :
$resultat2 = CalculeResultat($data['fr3'], $data['fr4'], $reel3, $reel4);

// calcul pour les scores 5 et 6 :
$resultat3 = CalculeResultat($data['fr5'], $data['fr6'], $reel5, $reel6);

// calcul pour les scores 7 et 8 :
$resultat4 = CalculeResultat($data['fr7'], $data['fr8'], $reel7, $reel8);

// calcul pour les scores 9 et 10 :
$resultat5 = CalculeResultat($data['fr9'], $data['fr10'], $reel9, $reel10);

?>



Modifié par Malcolm le 30/06/2008 18:59
Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 Malcolm  Posté le 28/06/2008 à 19:34  
  Astucien


7206 Messages

Désolé, je ne trouve plus l'icône pour coller le code source ...

Mais il faudrait que tu précises également quel type d'erreur tu as ...
Afficher le profil de Malcolm Voir la configuration de MalcolmEnvoyer un message privé à Malcolm
  Revenir en haut de la page
 nico3009  Posté le 29/06/2008 à 00:05  
Petit astucien

114 Messages

Salut,

je viens de voir ce que tu as fait. J'essaierai de m'y pencher la semaine prochaine faute de temps ;-)

En fait je n'ai pas de message d'erreur, ce sont les scores qui me sont retournés qui sont faux. Par exemple, le 1er devrait être de 2 et il est écrit 1.

Je te tiens au coiurant

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 29/06/2008 à 02:04  
  Astucien


7206 Messages

c'est surtout le nombre (impressionnant) de parenthèses utilisées qui, outre le coté fouilli du code non indenté qui plus est (mais techniquement ce forum PCA a des limites), gène manifestement la lecture et la compréhension ...

Avec tous tes elseif de partout on s'y perd un peu, j'ai du m'y reprendre à 2 fois. Ce que j'ai essayé de proposer ne te donnera p-ê pas le résultat escompté, je n'ai pas eu de quoi teser, mais j'ai essayé de respecter ce que tu énonçais en début de message ...

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

114 Messages

La requête s'exécute mais je n'ai pas les bons scores qui s'affichent.

Les réels sont :

0-1 / 1-1 / 0-0 / 0-0 / 0-0

et ceux du joueurs sont :

0-1 / 1-1 / 1-0 / 0-1 / 1-0

Je devrais donc avoir comme scores :

2 - 2 - 0 - 0 - 0

et j'obtiens :

0 - 1 - 2 - 2 - 2

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


7206 Messages

avec ma fonction ou avec tes parenthèses ?

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

114 Messages

Avec ta fonction. J'ai simplement modifié dans ta fonction un :

) && (

en

)&&(

pour que ca marche

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


7206 Messages

Mea culpa, il manquait des parenthèses, je les ai rajoutées !

Logiquement pas besoin de supprimer les espaces, c'est ce qui m'a mis la puce à l'oreille.

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

114 Messages

Ok, donc au niveau de l'exécution ça marche, mais au niveau du résultat tu vois quelque chose?

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 nico3009  Posté le 01/07/2008 à 19:23  
Petit astucien

114 Messages

Je remets le code complet corrigé au cas où l'erreur vienne d'ailleurs.

<? include ("source.php"); ?>

<?php

$hostname = "";
$user = "";
$password = "";
$nom_base_donnees = "";
$pseudo = $_POST['pseudo'];

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

$sql = "SELECT * FROM france WHERE pseudo = '".$_POST['pseudo']."'";
$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());

function CalculeResultat($data1, $data2, $reel1, $reel2)
{
$resultat = 0;


// on passe tout en entier
$data1 = intval($data1);
$data2 = intval($data2);
$reel1 = intval($reel1);
$reel2 = intval($reel2);

$diff_data1 = $data2 - $data1; // si positif, $data['fr2'] > $data['fr1']
$diff_reel1 = $reel2 - $reel1; // si positif, $reel2 > $reel1


// là on trouve les scores
if (($data1 == $reel1) && ($data2 == $reel2))
{
$resultat = 2;
}
else
{
// on n'a pas les scores, mais au moins le vainqueur
if (($diff_data1 > 0) && ($diff_reel1 > 0))
$resultat = 1;

if (($diff_data1 < 0) && ($diff_reel1 < 0))
$resultat = 1;

if (($diff_data1 == 0) && ($diff_reel1 == 0))
$resultat = 1;
};

return $resultat;
};

// calcul pour les scores 1 et 2:
$resultat1 = CalculeResultat($data['fr1'], $data['fr2'], $reel1, $reel2);

// calcul pour les scores 3 et 4 :
$resultat2 = CalculeResultat($data['fr3'], $data['fr4'], $reel3, $reel4);

// calcul pour les scores 5 et 6 :
$resultat3 = CalculeResultat($data['fr5'], $data['fr6'], $reel5, $reel6);

// calcul pour les scores 7 et 8 :
$resultat4 = CalculeResultat($data['fr7'], $data['fr8'], $reel7, $reel8);

// calcul pour les scores 9 et 10 :
$resultat5 = CalculeResultat($data['fr9'], $data['fr10'], $reel9, $reel10);

while($data = mysql_fetch_assoc($req))
{
?>

<TABLE BORDER=1 ALIGN=CENTER>
<CAPTION><FONT SIZE="5" <FONT FACE="ARIAL"> <FONT COLOR="BLUE">FRANCE</FONT></CAPTION>

<CAPTION><FONT SIZE="4" <FONT FACE="ARIAL"> <FONT COLOR="GREEN"><? echo $data['pseudo']; ?> a pronostiqué : </FONT></CAPTION> <br />

<TR>
<TH COLSPAN="5"> SCORES </TH>
<TH ALIGN=CENTER> BUTS </TH>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra1; ?></TD></FONT> <TD><B><? echo $data['fr1']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra2; ?></TD> <TD><B><? echo $data['fr2']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat1; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra3; ?></TD></FONT> <TD><B><? echo $data['fr3']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra4; ?></TD> <TD><B><? echo $data['fr4']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat2; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra5; ?></TD></FONT> <TD><B><? echo $data['fr5']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra6; ?></TD> <TD><B><? echo $data['fr6']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat3; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra7; ?></TD></FONT> <TD><B><? echo $data['fr7']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra8; ?></TD> <TD><B><? echo $data['fr8']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat4; ?></FONT></TD>
</TR>

<TR>
<TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra9; ?></TD></FONT> <TD><B><? echo $data['fr9']; ?></B></TD> <TD><FONT SIZE="3" <FONT FACE="ARIAL"><? echo $equipefra10; ?></TD> <TD><B><? echo $data['fr10']; ?></B></TD><TD></TD><TD ALIGN=CENTER> <FONT COLOR=RED><? echo $resultat5; ?></FONT></TD>
</TR>

<TR>
<TD COLSPAN="5" ALIGN=CENTER><FONT COLOR="BLUE"><B> TOTAL BUTS </B></FONT> <TD><B><? echo ; ?></B></TD>
</TR>
</TABLE>
<?php } ?>

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 01/07/2008 à 21:20  
  Astucien


7206 Messages

T'as du mal utiliser ma fonction, je présume parce que moi j'obtiens bien les bons résultats finaux ...

PEux-tu afficher réellement le retour de MySQL ? PArce qu'au final, je pense que ça vient de là l'erreur ...

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

114 Messages

J'ai fait les echo des $data['fr1,'] $data['fr2']... et des $reel1, $reel2... (j'espère que c'est bien ça que tu voulais) et j'ai obtenu ceci :

scores joueur 0111100110scores reels 0111000000

les scores sont 0 1 2 2 2 alors qu'ils devraient être de 2 2 0 0 0

Afficher le profil de nico3009Envoyer un message privé à nico3009
 Revenir en haut de la page
 Malcolm  Posté le 01/07/2008 à 22:45  
  Astucien


7206 Messages

Petit coquin, va

tu ne peux pas faire tes calculs ($resultat1 à $resultat5) tant que tu n'as pas déclaré ton $data (tant que$data n'est pas déclaré, $data['fr1'] n'existe pas ...)

Or ton $data, tu le déclares grâce au while ...

Donc tu dois placer toutes les lignes $resultat1 à $resultat5 dans le while :)

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

114 Messages

Aïe, je suis désolé mais la fontion "while" je l'ai prise sur un tuto et je ne connais pas trop son fonctionnement. (Il n'y a pas que celle là d'ailleurs). J'essaie de l'insérer avant mais je n'y arrive pas.

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


7206 Messages

bin while(condition)

{

// et là tu mets tes calculs de $resultat1 => $resultat5

}

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

114 Messages

Génial!!

En fait j'ai remonté le while avant de définir $résultat 1, 2... mai ça me mettait une page blanche.

J'ai supprimé les accolades qui se trouvaient entre les $resultats et mon tableau html car sinon la boucle s'arretait.

Merci Malcom

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




Les sujets pertinents liés
espace membre
Tester si formulaire envoyé au moins une fois.
avis aux utilisateurs IE6 et inferieur
phpmysql et FPDF
probleme avec
Filezilla
Offre hebergement 300mo Gratuit
formulaire avec contrôle anti-spam
conditions dans switch
Problème de compatibilité IE
formulaire a l'aide
SELECT dans BD sans résultat
Mettre tableaux d'Excel sur le net
initialisation d'un site orange
Ouvrir une session avec un mot de passe crypté
localisation du code
creation site
 
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