Portail PHP

Forum de discussion et d'aide au php

Vous n'êtes pas identifié.

Annonce

Regles d'utilisation des forums : pensez à toujours les respecter si vous désirez obtenir des réponses rapides.
FAQ : pensez à toujours chercher dedans si la réponse à votre question est dedans.
Proposez vos news : si vous avez un evenement à annoncer
le chat : venez discuter de php.
 

#1 03-12-2007 00:44:03

didier08
Membre
Date d'inscription: 31-10-2007
Messages: 17

boucle while récalcitrante

Bonjour
j'aimerais faire  un script qui sélectionne les courses ouvertes à un cheval en fonction des critères d' engagement
j'ai commencé à faire une boucle while qui passe en revue toutes les courses disponibles et qui regarde si le cheval rempli les conditions

pour l'age la boucle se comporte bien
pour le sexe aussi
pour les gains aussi
c'est pour la nationalité qu'elle ne veut rien savoir pourtant indépendamment le critère fonctionne bien
mes questions sont
ya t'il une méthode plus facile ???
ya t'il un nombre limité de condition dans une boucle while ???
mes break sont ils adéquates ???

voici mon script

Code:

$i=0;
while ($i<$nb+1)
{
$result2=mysql_db_query($sql_bdd,"select * from courses where idcourse= $i ",$db_link);
while ($donnees2 = mysql_fetch_array($result2) )
{
if($donnees2['age']>$age){break ;}
elseif($donnees2['age2']<$age){break ;}
elseif($donnees2['sexe']=='M')
    {if($sex=='F')break;}
elseif($donnees2['sexe']=='F')
    {if($sex=='M')break;}
elseif($donnees2['supinf1']=='sup')
    {if($donnees2['gains1']>$gains)break;}
elseif($donnees2['supinf1']=='inf')
    {if($donnees2['gains1']<$gains)break;}
elseif($donnees2['natio']=='f')
        if($natio>1){break;}
elseif($donnees2['natio']=='e')
        if($natio>2){break;}

else
echo '';?><br><?
echo 'réunion : ',$donnees2['reunion'];?><br><?
echo 'course : ',$donnees2['course'];?><br><?
echo 'sexe : ',$donnees2['sexe'];?><br><?
echo 'distance : ',$donnees2['distance'];?><br><?
echo 'corde : ',$donnees2['corde'];?><br><?
echo 'ouvrert au : ',$donnees2['natio'];?><br><?
echo 'ayant ou n ayant pas : ',$donnees2['supinf1'];?><br><?
echo 'gains : ',$donnees2['gains1'];?><br><br><?
}
    

$i++;
}

.

Hors ligne

 

#2 03-12-2007 05:32:44

lolo3129
Membre
Lieu: Paris
Date d'inscription: 10-05-2005
Messages: 505
Site web

Re: boucle while récalcitrante

hello,

pour la première boucle, tu peux utiliser un for :

Code:

for($i=0; $i<$nb+1; $i++) { // blabla }

la seconde boucle while est bien

tu peux mettre autant de test que tu veux. tu peux aussi en faire un seul, en utilisant les opérateurs logiques && (et) et || (ou)

le break te fait sortir de ta boucle (donc on ne vérifie pas les autres courses. C'est peut être plus "continue" qu'il faut mettre au lieu de "break"

pour ton test, je te suggère de vérifier les valeurs de $natio et $donnees2['natio']

le "else" ne sert à rien dans ton code, pas plus que le echo "";
tu peux aussi concaténer les chaînes en utilisant . (le point) comme séparateur.

++

Hors ligne

 

#3 03-12-2007 14:08:13

didier08
Membre
Date d'inscription: 31-10-2007
Messages: 17

Re: boucle while récalcitrante

merci de m'avoir répondu j'ai donc changé mon while par un for mais je n'ai noté aucun changement

j'ai utilisé les break car mes conditions sont toutes castratives donc je pensais que dès qu'une condition s'avérait positive le break arrétait la boucle mais revenait en début de boucle pour cheeker la prochaine
et si le cheval passsait les test avec brio on m'affichait les caracts de la course
tout cela marchait comme sur des roulettes jusqu'a ce je fasse cette condition sur la nationalité qui au demeurant quand elle est toute seule remplie parfaitement son office ce qui m'avait poussé à penser que je mettais trop de condition
le mystere reste entier


par contre je vais me pencher sérieusement sur les && et || et croisant les doigts

pour la mise en forme il est évident que cela ne va rester en l'état et que cette page n'est qu'un brouillon pour me familiariser avec le mécanisme

Hors ligne

 

#4 04-12-2007 03:39:34

lolo3129
Membre
Lieu: Paris
Date d'inscription: 10-05-2005
Messages: 505
Site web

Re: boucle while récalcitrante

le break fait sortir de la boucle, le continue saute le reste du code de la boucle (mais on reste dans la boucle)
dans ton cas, tu ne passes pas à la course suivante, mais au cheval suivant. je pense qu'il vaut mieux utiliser le continue.

A mon avis, ton seul problème est cette histoire de break/continue : à cause du test de la nationalité, une des premières courses ne convient pas à cause de ce test pour une grande partie des chevaux, et le break fait que les autres courses ne sont pas testées.

Hors ligne

 

#5 04-12-2007 03:44:29

lolo3129
Membre
Lieu: Paris
Date d'inscription: 10-05-2005
Messages: 505
Site web

Re: boucle while récalcitrante

une autre remarque me vient à l'esprit : je croyais que tu avais une boucle sur les chevaux et une sur les courses, mais en fait, tu as juste une boucle pour les courses et tu fais une requête par course !

tu peux faire plus simple à ce moment là avec

Code:

$result2=mysql_db_query($sql_bdd,"select * from courses where idcourse<=$nb ",$db_link);
while ($donnees2 = mysql_fetch_array($result2) )
{
  // faire les tests ici
}

tu auras alors plusieurs résultats dans ton result2, et à ce moment là, c'est intéressant de mettre un while et un continue;

Dernière modification par lolo3129 (04-12-2007 03:45:31)

Hors ligne

 

#6 04-12-2007 06:46:05

didier08
Membre
Date d'inscription: 31-10-2007
Messages: 17

Re: boucle while récalcitrante

bonjour
j'ai  donc troqué mon break contre un continue si c'est comme cela que ca marche par contre tu me confirmes que le continue arrete le déroulement des tests en cours et recommence avec la course suivante

j'ai donc appliqué à la lettre tes consignes (mis à part la mise en forme c'est un détail) et j'ai reformulé mon script de la facon suivante et ca avait l'air de marcher

Code:

$result=mysql_db_query($sql_bdd,"select * from courses ",$db_link);
$nb=mysql_num_rows($result); 
for($i=0; $i<$nb+1; $i++)
{
$result2=mysql_db_query($sql_bdd,"select * from courses where idcourse= $i ",$db_link);
while ($donnees2 = mysql_fetch_array($result2) )
{
if(($donnees2['age']>$age)||($donnees2['age2']<$age)
||
(($donnees2['sexe']=='M')&&($sex=='F'))
||
(($donnees2['sexe']=='F')&&($sex=='M'))
||
(($donnees2['supinf1']=='sup')&&($donnees2['gains1']>$gains))
||
(($donnees2['supinf1']=='inf')&&($donnees2['gains1']<$gains))
||
(($donnees2['natio']=='f')&&($natio>1))
||
(($donnees2['natio']=='e')&&($natio>2)))

{continue;}

else
echo '';?><br><?
echo 'réunion : ',$donnees2['reunion'];?><br><?
echo 'course : ',$donnees2['course'];?><br><?
echo 'sexe : ',$donnees2['sexe'];?><br><?
echo 'distance : ',$donnees2['distance'];?><br><?
echo 'corde : ',$donnees2['corde'];?><br><?
echo 'ouvrert au : ',$donnees2['natio'];?><br><?
echo 'ayant ou n ayant pas : ',$donnees2['supinf1'];?><br><?
echo 'gains : ',$donnees2['gains1'];?><br><br><?
}
}

pour ce qui est de la boucle pour les chevaux
en réalité pour arriver sur cette page on vient de la fiche personnelle du cheval et en cliquant sur un lien pour voir les courses qui lui sont ouvertes
donc on a déjà toutes les infos utiles pour ce dernier
pour les conditions j'en ai pas finis car c'etaient les critères de selections les plus simples maintenant que j'ai le mécanisme va faloir que je mette un peu d'huile dans les engrenages de mon cerveaux pour compliquer l'affaire

je vais me tenter également à ta solution plus simple
mais je vois pas trops comment faire pour ne lui faire afficher que les courses ouvertes à ce cheval

Hors ligne

 

#7 04-12-2007 07:27:00

lolo3129
Membre
Lieu: Paris
Date d'inscription: 10-05-2005
Messages: 505
Site web

Re: boucle while récalcitrante

hello,

tu peux te limiter à la première requête sql, pas besoin de la première boucle, la seconde suffit.

Code:

$result=mysql_db_query($sql_bdd,"select * from courses ",$db_link);
while ($row = mysql_fetch_array($result))
{
  if (/* test non conforme */)
    continue;

  // afficher la course
}

pour n'avoir que les courses ouvertes au cheval, je te suggère d'ajouter une autre table, avec 2 colonnes : id du cheval et id de la course

il faudra alors faire une requête un peu plus compliquée pour n'avoir que les courses qui sont aussi dans la table pour le cheval en question.
tu peux regarder du côté des jointures SQL

++

Hors ligne

 

#8 04-12-2007 10:24:59

didier08
Membre
Date d'inscription: 31-10-2007
Messages: 17

Re: boucle while récalcitrante

Ok merci pour tout

j'ai donc simplifié en ne mettant qu'une boucle et ca marche aussi (trop cool)

bon je vais continuer ce periple mais je crois bien que vous me reverrez ici dans pas tres longtemps (lol)

encore merci pour ta patience

didier

Hors ligne