PHP|Débutant :: Forums

Advertisement

Besoin d'aide ? N'hésitez pas, mais respectez les règles

Vous n'êtes pas identifié(e).

#1 08-05-2012 16:39:41

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Problème boucle foreach

Hello tout le monde,
J'ai un soucis et cela fait 2 jours que je recherche des solutions mais rien y fait.

Voici mon soucis :

$select = 'SELECT * FROM resultat WHERE MONTH(DateDebut)="05" ORDER BY DateDebut ASC';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$nb=mysql_num_rows($result);
$links = array() ;
while ($data = mysql_fetch_array($result) ) {
if(substr($data["DateDebut"], 5,2)==date("m")){
$liste[] = substr($data["DateDebut"], 8,2);
$links = array() ;


foreach ( $liste as $value ) {
$links[$value] = '<a class="imag" href=agenda.php?var='.$value.'>'.$value.' <span style="background-color:#FFF;width: 350px;">'.$data["NomMeeting"].'<br>Lieu: '.$data["Lieu"].'</span></a>';
echo $value;
}


}}

En effet après avoir récupérer mes 3 date dans la base de données, je fais un foreach afin de les afficher dans mon calendrier. Cepedant, je n'arrive pas à un résultat concluant. Dans mon écho $value, j'obtiens : 13 13 17 13 17 25.

Alors que normalement je devrais avoir 13, 17, 25 sad

Est-ce quelqu'un aurait une idée?

Merci et bonne soirée,
Linkman

Dernière modification par linkman (08-05-2012 16:44:01)

Hors ligne

#2 08-05-2012 17:13:31

moijhd
Membre
Inscription : 13-06-2009
Messages : 167

Re : Problème boucle foreach

Hey !

D'abord, je voudrais savoir à quoi sert le substr ? Si le champ DateDebut est une date alors il y a des traitements plus apropriés pour récupérer le mois que le substr (en utilisant des traitements sur le type date).

C'est par là que je commencerais smile

Hors ligne

#3 08-05-2012 17:32:22

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

J'ai changé les substr par des explode mais toujours le même résultat sad


$select = 'SELECT * FROM resultat WHERE MONTH(DateDebut)="05" ORDER BY DateDebut ASC';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$nb=mysql_num_rows($result);
$links = array() ;
while ($data = mysql_fetch_array($result) ) {
    $date = $data["DateDebut"];
    $date_explosee = explode("-", $date);
    if($date_explosee[1]==date("m")){
        $liste[] = $date_explosee[2];
        $links = array() ;
        foreach ( $liste as $value ) {
            $links[$value] = '<a class="imag" href=agenda.php?var='.$value.'>'.$value.' <span style="background-color:#FFF;width: 350px;">'.$data["NomMeeting"].'<br>Lieu: '.$data["Lieu"].'</span></a>';
            echo $value;
            }
        }
    }

Dernière modification par linkman (08-05-2012 17:32:53)

Hors ligne

#4 08-05-2012 17:49:11

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Problème boucle foreach

Bon, tout d'abord, on ne va pas relancer les hostilités intergalactiques.
Quand tu auras remplacé ton * par des noms de colonnes, voire YEAR, MONTH et DAY sur la colonne DateDebut, on y verra plus clair.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#5 08-05-2012 17:57:45

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème boucle foreach

Bonjour

linkman a écrit :

WHERE MONTH(DateDebut)="05"

On veut bien t'aider, mais faut quand même faire l'effort de réfléchir ne serait-ce qu'un peu à ce que l'on ecrit, et si tu fais semblant, fait en sorte qu'on ne le voye pas wink
Blague à part, un

WHERE MONTH(DateDebut)=5

est quand même plus correct. Ensuite vu ton code PHP, il faut supprimer la ligne 8 et ecrire dans ta requete

WHERE MONTH(DateDebut)=MONTH(NOW())

Ceci ne doit pas t'exempter de suivre les autres recommendations faites ici.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#6 08-05-2012 18:17:20

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

Merci beaucoup, c'est la première fois que j'utilise MONTH().

J'ai effectivement changé dans mon code mais suis vraiment désolé mais je ne comprend toujours pas pourquoi mon foreach passe plusieurs fois (trop) ???

merci

Hors ligne

#7 08-05-2012 18:22:14

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème boucle foreach

Ton foreach va boucler autant de fois que ton tableau $liste a de lignes. Donc si ton foreach te sort des lignes en plus, c'est que ta requête est fausse tout simplement. Commence par là pour résoudre tes problèmes.

++


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#8 08-05-2012 18:29:53

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

Ok, pourtant dans mon while il passe 3x.

Est-ce possible que mon foreach se cumule au fur et a mesure d'ou mes nombreux résultat?

Hors ligne

#9 08-05-2012 18:36:43

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème boucle foreach

^^ En effet, ton foreach est dans ton while


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#10 08-05-2012 18:43:25

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Problème boucle foreach

J'ai réindenté ton bout de script pour le rendre plus lisible, et $liste n'y est jamais réinitialisé.
Donc l'affectation en ligne 9 ajoute à chaque fois une dimension à ton array sans supprimer les précédentes.
Mais, de toutes façons ton code est bien trop laxiste.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#11 08-05-2012 18:51:29

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

Merci pour avoir réinventé le code. Le problème c'est que si je vide mon $liste je n'ai qu'une date et c'est la dernière dans le mois qui apparait.

Actuellement, les dates sont bien affiché dans mon calendrier, mais les données liées à la date qui s'affichent corresponde toujours à la dernière date traitée du mois.

Hors ligne

#12 08-05-2012 19:00:13

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Problème boucle foreach

Ô, je ne l'ai malheureusement pas réinventé (dans ce cas je pense très imodestement que tu ne le reconnaitrais plus) je l'ai juste ré-inDenté.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#13 08-05-2012 19:07:14

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème boucle foreach

Il ne faut pas confondre un for each et une simple boucle.
Je vous suggère de nous montrer un code corrigé de toutes les remarques que l'on a pu vous faire, juste pour y voir plus clair d'une part et pour voir si vous avez bien tout compris d'autre part.

Cordialement,

Jc.


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#14 08-05-2012 19:16:14

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

Voici ou j'en suis:


$select = 'SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) ORDER BY DateDebut ASC';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$nb=mysql_num_rows($result);
$meeting = array() ;
while ($data = mysql_fetch_array($result) ) {
  $date = $data["DateDebut"];
  $date_explosee = explode("-", $date);
  if($date_explosee[1]==date("m")){
    unset($liste);
    $liste[] = $date_explosee[2];
    $meeting[] = $data["NomMeeting"];
    $links = array() ;
    $i=0;
    foreach ( $liste as $value ) {
      $sql="SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) AND DAY(DateDebut)=".$liste[$i]."";
      $req=mysql_query($sql);
      $result2 = @mysql_fetch_array($req);
      $links[$value] = '<a class="imag" href=agenda.php?var='.$value.'>'.$value.' <span style="background-color:#FFF;width: 350px;">'.$result2["NomMeeting"].'<br>Lieu: '.$result2["Lieu"].'</span></a>';
      $i = $i+1; 
    }
  }
}
print_r($links);
Calendrier($m, $a, $links);

 

Ma requête dans le foreach est correct, je passe 3 fois dans celui-ci et j'obtiens ceci :

SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) AND DAY(DateDebut)=13
SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) AND DAY(DateDebut)=17
SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) AND DAY(DateDebut)=25

Lorsque les dates s'affichent sur mon calendrier je ne vois toujours que la dernière (25 mai 2012).

Dernière modification par linkman (08-05-2012 19:17:09)

Hors ligne

#15 08-05-2012 19:19:12

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème boucle foreach

C'est bien ce qui me semblait, vous n'avez pas compris et donc pas appliqué tout ce que l'on a pu vous dire.
De façon a vous expliquer de la meilleure façon possible, que comprenez vous dans votre code?


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#16 08-05-2012 19:25:17

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

Oups le vrai code est celui là me suis planté de code:


$select = 'SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) ORDER BY DateDebut ASC';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$nb=mysql_num_rows($result);
$meeting = array() ;
while ($data = mysql_fetch_array($result) ) {
  unset($liste);
  $liste[] = $date_explosee[2];
  $meeting[] = $data["NomMeeting"];
  $links = array() ;
  $i=0;
  foreach ( $liste as $value ) {
    $sql="SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) AND DAY(DateDebut)=".$liste[$i]."";
    $req=mysql_query($sql);
    $result2 = @mysql_fetch_array($req);
    $links[$value] = '<a class="imag" href=agenda.php?var='.$value.'>'.$value.' <span style="background-color:#FFF;width: 350px;">'.$result2["NomMeeting"].'<br>Lieu: '.$result2["Lieu"].'</span></a>';
    $i = $i+1; 
  }
}

print_r($links);
Calendrier($m, $a, $links);
 

Hors ligne

#17 08-05-2012 19:27:37

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

OMG, j'ai enfin trouvé la solution:


$select = 'SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) ORDER BY DateDebut ASC';
$result = mysql_query($select) or die ('Erreur : '.mysql_error() );
$nb=mysql_num_rows($result);
$meeting = array() ;
while ($data = mysql_fetch_array($result) ) {
  $liste[] = substr($data["DateDebut"], 8,2);
  $meeting[] = $data["NomMeeting"];
  $links = array() ;
  $i=0;
  foreach ( $liste as $value ) {
    $sql="SELECT * FROM resultat WHERE MONTH(DateDebut)=MONTH(NOW()) AND DAY(DateDebut)=".$liste[$i]."";
    $req=mysql_query($sql);
    $result2 = @mysql_fetch_array($req);
    $links[$value] = '<a class="imag" href=agenda.php?var='.$value.'>'.$value.' <span style="background-color:#FFF;width: 350px;">'.$result2["NomMeeting"].'<br>Lieu: '.$result2["Lieu"].'</span></a>';
    $i = $i+1; 
  }
}

print_r($links);
Calendrier($m, $a, $links);
 

Enfin !!!!!
Merci beaucoup à tous, cela fait plaisir d'avoir de l'aide quand on est vraiment perdu smile

Hors ligne

#18 08-05-2012 19:34:01

Jc
Membre
Lieu : Zillisheim - Alsace
Inscription : 15-04-2010
Messages : 1 629
Site Web

Re : Problème boucle foreach

Bien de rien c'est déjà mieux, mais il y a encore beaucoup à dire sur ce code, car visiblement vous n'épargnez pas vos serveurs... En effet si votre tableau $liste contient 50 dates vous faites 51 requêtes à votre SGBDR alors que vous pourriez n'en faire qu'une seule et diviser ce code au moins par deux.
++

Dernière modification par Jc (08-05-2012 19:36:26)


POO PHP+Ajax en MVC avec PDO et Bases de données épaisses  : What else?

Hors ligne

#19 08-05-2012 19:34:18

Maljuna Kris
Infantimigulo
Lieu : Douarnenez 29100 Breizh Izel
Inscription : 08-05-2009
Messages : 2 453
Site Web

Re : Problème boucle foreach

Je vois, hélas, que tu persistes avec ton SELECT *.


Gloire à qui n'ayant pas d'idéal sacro-saint,
Se borne à ne pas trop emmerder ses voisins. G. Brassens Don Juan 1976.
Avĉjo MoKo kantas
La chaîne YouTube MoKo Papy

Hors ligne

#20 08-05-2012 19:43:37

linkman
Membre
Inscription : 28-03-2010
Messages : 13

Re : Problème boucle foreach

D'accord merci du conseil. Il est vrai que je met toujours des SELECT * alors que je devrais juste spécifier les cellules dont j'ai besoin.

Je vais voir pour optimiser le code.

Hors ligne

Pied de page des forums