Boucle FOR [résolu]

Boucle FOR [résolu] - PHP - Programmation

Marsh Posté le 10-06-2004 à 18:01:13    

Bonjour,
 
J'aurai besoin d'aide pour remplir un tableau à partir d'une requête sql, il s'agit de voir quelle reunion est organisée dans quelle salle.
Le problème c'est que la requête en question ne retourne rien... ou du moins je ne vois rien affiché donc difficile de voir ce qui ne va pas...
 
Voyez plutôt le résultat:
http://sabrosa.free.fr/tab.jpg
 
Je suis dessus depuis déjà 2 jours et ça me rend fou (je tiens à préciser que mon niveau en prog php laisse à désirer :sweat:)
Voici la partie du code censé afficher "Libre" ou "Occupé" dans chaque cellule:
 

Code :
  1. // Recherche des dates de reunion pour chaque salle
  2. for ( $j=1; $j <= 5; $j++ ) {
  3. for ( $k=1; $k <= 2; $k++ ) {
  4.  if ($k == 1) {
  5.   $demi = "M";
  6.  } else {
  7.   $demi = "A";
  8.  }
  9. echo "<TD width=\"51\" align=\"center\">";
  10.         $sql2 = 'SELECT id_reunion, date_reunion, demi_journee, objet, nom_demandeur, service_demandeur FROM reunions
  11.                  WHERE no_salle = '.$data['id_salle'].'
  12.                  AND date_reunion = '.date("Y-m-d", '.mktime(0,0,0,$y_year,$m_month,$d_day).').'
  13.     AND demi_journee = "'.$demi.'";';
  14.         $req2 = mysql_query($sql2) or die ('Erreur SQL !<br>'.$sql2.'<br>'.mysql_error());
  15. while($data2 = mysql_fetch_array($req2))
  16.      {
  17.   if ($data2["objet"] == "" ) {
  18.    echo "Libre";
  19.   } else {
  20.    echo "Oqp";
  21.   }
  22.      }
  23. echo "</TD>";
  24. }
  25. $d_day = $d_day+1;
  26. }


 
Merci d'avance pour votre aide! :jap:


Message édité par Doudos le 11-06-2004 à 18:16:27

---------------
A+,
Reply

Marsh Posté le 10-06-2004 à 18:01:13   

Reply

Marsh Posté le 10-06-2004 à 18:03:45    

PS: Evidemment les reunions le samedi & dimanche sont inexistantes... faut juste que je supprime l'affichage de ces 2 jours, mais ça c'est un autre problème! :D


---------------
A+,
Reply

Marsh Posté le 10-06-2004 à 18:35:23    

1er erreur :
mktime(0,0,0,$m_month,$d_day,$y_year)
 
Tu peux aussi gérer la demin journée dans la date : minuit pour le matin, midi pour l'après midi
 
matin : mktime(0,0,0,$m_month,$d_day,$y_year)
après midi : mktime(12,0,0,$m_month,$d_day,$y_year)
date doit alors prendre en 1er paramètre Y-m-d auquel il faut ajouter G et i pour l'heure et les minutes


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 10-06-2004 à 18:39:55    

Ensuite, plutôt que de faire n requêtes, utilise date_reunion BETWEEN (date_debur_semaine, date_fin_semaine) ORDER BY date_reunion ASC
 
Cela te permet de récupérer toutes les positions occupées en 1 seule fois et ensuite tu gères l'affichage


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 10-06-2004 à 18:46:13    

En passant à mktime(0,0,0,$m_month,$d_day,$y_year) rien n'a changé... du moins au niveau de ce qu'il retourne...
 
Le truc c'est que cette page existe déjà et fonctionne mais en ASP et il faudrait la même en PHP.
Pour ce qui est des demi-journées, celles-ci sont gérées via la base de donnée par un champ "demi_journee" avec comme valeur M ou A (pour Matin ou Après-midi) et je n'ai pas la possibilité de changer ça, mais c'est vrai que ta soluce paraît + pratique je n'y avais jamais pensé. ;)
 
Si vous voulez, j'ai cette partie du code en ASP mais j'y comprends pas grand chose... :(


---------------
A+,
Reply

Marsh Posté le 10-06-2004 à 18:53:38    

Moi non plus mais envoie toujours ...
 
Tu peux garder  la demi journée dans ta table et gérer cela avec les dates quand même puisque tu as ce champs date. ASP continue avec ce champs là, PHP non ...


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 10-06-2004 à 18:59:47    

La requête récupère plus d'infos et les résultats retournés sont mieux exploités, mais sur le principe je pense que ça correspond...
J'affinerai plus tard ce que j'ai fait en PHP, mais j'aimerai bien que ça fonctionne déjà avec ce qu'il y a :crazy:
 

Code :
  1. '
  2. ' On affiche les réservations de la salle traitée
  3. '
  4.  err = 0
  5.  If request("InitDate" ) = "" then
  6.   Date_du_jour= DateValue(now())
  7.  else
  8.   Date_du_jour=Cdate(Request("InitDate" ))
  9.   end if
  10.   For Icol = 1 to 5
  11.   Do while weekday(Date_du_jour,vbmonday) > 5
  12.    Date_du_jour = Date_du_jour+ 1
  13.   loop
  14.   Ddate = Month(Date_du_jour) & "/" & Day(Date_du_jour) & "/" & Year(Date_du_jour)
  15.   For IDemi = 1 to 2
  16.   Response.write ("<td width='51' align='center'><small>" )
  17.   Select Case IDemi
  18.    Case 1
  19.     Demi = "M"
  20.    Case 2
  21.     Demi = "A"
  22.   End select
  23.   szSQL = "SELECT DISTINCTROW Salles.[Nom de la salle], Salles.[Identifiant de la salle], Salles.[N° téléphone], "
  24.   szSQL = szSQL & "Réunions.[IdRéunion], Réunions.[Date de la réunion], Réunions.[Demi-journée], "
  25.   szSQL = szSQL & "Réunions.[Objet], Réunions.[Nom du demandeur], Réunions.[Service du demandeur] "
  26.   szSQL = szSQL & "FROM Réunions INNER JOIN Salles ON Réunions.[N° de salle] = Salles.[Identifiant de la salle] "
  27.   szSQL = szSQL & "WHERE (Réunions.[Date de la réunion]) = #" & Ddate & "# "
  28.   szSQL = szSQL & "AND Réunions.[Demi-journée] = '" & Demi & "' "
  29.   szSQL = szSQL & "AND Salles.[Nom de la salle] = '" & Salles (Isal) & "' "
  30.   szSQL = szSQL & "ORDER BY Salles.[Nom de la salle], Réunions.[Date de la réunion], Réunions.[Demi-journée] DESC;"
  31.   Set oRS1=oconn.execute(szSQL)
  32.   if err <> 0  and err <> 3021 then
  33.    Response.write ("<br>Erreur lecture des réservations <br>"& err.description )
  34.    Response.end
  35.   end if
  36.   if not oRS1.EOF then
  37.    Objet=oRS1("Objet" )
  38.    Demandeur=oRS1("Nom du demandeur" )
  39.    response.write ("<a href='Reservation_modification.asp?Id=" & oRS1("IdRéunion" ) & "'>" )
  40.     response.write ("<img src='images/reunions1.gif'  border='0' alt='Objet : " & Objet & " // Organisé par : " & Demandeur & " Identifiant : " & oRS1("IdRéunion" ) & "'>" )
  41.     response.write ("</a>" )
  42.   else
  43.    response.write "<a href='javascript:Reserver(" & quote & Salles(ISal) & quote
  44.    response.write (", " & day(date_du_jour) & ", " & month(date_du_jour) & ", " & year(date_du_jour))
  45.    response.write (", " & quote & Demi & quote & " )';>Libre</a>" )
  46.      end if
  47.   response.write "</td>"
  48.    Next
  49.  Date_du_jour=Date_du_jour + 1
  50.   Next
  51.   Response.write("</small></td>" )


---------------
A+,
Reply

Marsh Posté le 10-06-2004 à 19:47:33    

Ta requete cherche 1salle, 1date et 1 demi journée données. Donc il faudrait remplacer ta boucle while par  

Code :
  1. if (mysql_num_rows($req2) == 1){
  2.       //on a un enregistrement alors occupé
  3.       $date2 = mysql_fetch_array($req2);
  4.       //affichage
  5. }
  6. elseif (mysql_num_rows($req2) == 0) {
  7.       //c'est libre
  8.       //affichage
  9. }
  10. else {
  11.       // c'est pas normal, il y a un bug
  12. }
  13. mysql_close();


 
autre proposition de fonctionnement  

Code :
  1. <?php
  2. $aujourdhui = time();
  3. $jour_actuel = date("w", $aujourdhui);
  4. if ($jour_actuel <> 1) {
  5. switch ($jour_actuel) {
  6.  case 0 :
  7.   //on est dimanche donc on passe au lundi suivant
  8.   $deb_semaine = $aujourdhui + 86400;
  9.   break;
  10.  case 6 :
  11.   //on est samedi donc idem -> lundi suivant
  12.   $deb_semaine = $aujourdhui + (86400 * 2);
  13.   break;
  14.  default :
  15.   //on se place sur le lundi de la semaine en cours
  16.   $debut_semaine = $aujourdhui - (86400 * ($jour_actuel - 1));
  17.   break;
  18.  }
  19. }
  20. else {
  21. $debut_semaine = $aujourdhui;
  22. }
  23. $fin_semaine = $debut_semaine + (86400 * 5);
  24. $requete = "SELECT `date_reunion`, `no_salle`, `demi_journee`, `tes autres champs` FROM `ta table`
  25.  WHERE (date_reunion BETWEEN ".date("Y-m-d", $debut_semaine)." AND ".date("Y-m-d", $fin_semaine)." )
  26.  ORDER BY date_reunion ASC, demi_journee DESC, no_salle ASC;";
  27. $reponse_SQL = mysql_query($requete, $link_db) or die("Erreur requete ".mysql_error());
  28. //récupérer les enregistrements dans 1 tableau
  29. //parcourir la semaine par demi journées
  30. //vérifier si la salle est occupée ou non
  31. //afficher en conséquence


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 11-06-2004 à 13:37:57    

j'ai remplacé la boucle while par un if comme tu l'as dit
 

Code :
  1. if (mysql_num_rows($req2) == 1) {
  2.           //on a un enregistrement alors occupé
  3.           $data2 = mysql_fetch_array($req2);
  4.           //affichage  
  5.    echo "Oqp";
  6.       }
  7.       elseif (mysql_num_rows($req2) == 0) {
  8.           //c'est libre
  9.    echo "Libre";
  10.    }
  11.    else {
  12.           // c'est pas normal, il y a un bug  
  13.    echo "Bug";
  14.    }


 
maintenant, toutes les cellules sont remplies par "Libre" pourtant j'ai bien créer quelques "pseudo" reunions dans la bdd...
je me demande si l'incrémentation de la date du jour fonctionne, ou tout simplement si le format de la date correspond au format de celui du champ "date_reunion" (YYYY-MM-DD)
 
je comprend que moyennement ton autre proposition :sweat:
pour virer le samedi et le dimanche je pense que je pourrai le faire en récupérant le jour de la semaine, et en supprimant 0 (dimanche) et 6 (samedi)


---------------
A+,
Reply

Marsh Posté le 11-06-2004 à 13:51:10    

Je commence par me positionner sur le lundi de la semaine en cours. Sauf si nous sommes samedi ou dimanche où je me positionne sur le lundi suivant.
 
Ensuite je détermine la date fin de semaine qui correspond au vendredi.
 
l'etape suivante est de faire la requete sur le base en demandant la liste des salles occupées, des dates et de l'heure pour les dates comprises entre le debut et la fin de semaine (calculé auparavant)


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 11-06-2004 à 13:51:10   

Reply

Marsh Posté le 11-06-2004 à 13:53:18    

Commence par vérifier ce que te retourne ta requete avec phpmyadmin par exemple. Si c'est OK, c'est que cela vient du traitement de la réponse.


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 11-06-2004 à 18:15:08    

wouhouhou!! ça marche!! :bounce:
 
Apparemment ct juste un problème de date qu'il fallait mettre entre " "
 

Code :
  1. $jour_n = date("Y-m-d", mktime(0,0,0,$m_month,$d_day,$y_year));
  2. $sql2 = 'SELECT id_reunion, date_reunion, demi_journee, objet, nom_demandeur, service_demandeur FROM reunions
  3.          WHERE no_salle = '.$data['id_salle'].'
  4.          AND date_reunion = "'.$jour_n.'"
  5.         AND demi_journee = "'.$demi.'";';
  6. $req2 = mysql_query($sql2) or die ('Erreur SQL !<br>'.$sql2.'<br>'.mysql_error());
  7.      if (mysql_num_rows($req2) == 1) {
  8.           //on a un enregistrement alors occupé
  9.           $data2 = mysql_fetch_array($req2);
  10.           //affichage  
  11.  echo "<IMG SRC=\"images/reunions1.gif\">";
  12.      }
  13.      elseif (mysql_num_rows($req2) == 0) {
  14.           //c'est libre
  15.  echo "Libre";
  16.   }
  17.   else {
  18.           // c'est pas normal, il y a un bug  
  19.  echo "Bug";
  20.   }


 
Merci pour ton aide T509 vraiment! ;)


Message édité par Doudos le 11-06-2004 à 18:16:02

---------------
A+,
Reply

Marsh Posté le 11-06-2004 à 19:21:42    

Il ne te reste plus qu'à optimiser ta boucle pour éviter de faire n requêtes sur le serveur.
 
1ere étape : autant de requetes que de salles
2eme etape : 1 seule et unique requete pour la semaine.


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Marsh Posté le 11-06-2004 à 19:25:04    

Tout ce que tu as pu voir du code se trouve dans une boucle while qui retourne le nom des différentes salles existantes... donc je pense que le nombre de requête est déjà limité non?


---------------
A+,
Reply

Marsh Posté le 11-06-2004 à 19:48:08    

oui mais tu fais une requete par salle et par date et par demi journée.
 
sur 5 jours, cela fait 10 requetes par jour fois le nombre de salles.
 
En 1 requete par salle, tu peux arriver à avoir les 5 jours de la semaines. Cela divise par 10 le nombre de requetes.
 
Il y a moyen de faire une seule requete pour tout aussi
 
relis un de mes post plus haut


---------------
fermez vos topics résolus avec le tag [Résolu] en fin de titre. Merci !
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed