une boucle qui ne s'exécute pas

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : une boucle qui ne s'exécute pas

par Zurg » 14 sept. 2007, 10:05

Merci,

donc si j'ai bien compris, j'ai fait n'importe quoi ! Je me rendais bien compte que ma boucle s'arrêtait trop tôt, du coup j'essayais à chaque itération du for, de remettre le pointeur au début avec un reset, mais ça marchait pas.

Mon problème, c'est que mon champs date est de type text. Si je le passe en date, le format mysql écrit les mois avec 2 chiffres, soit 09 pour septembre, alors que ma fonction de calendrier me renvoit 9 pour septembre. Ce problème peut s'arranger en rajoutant le "0" , ou peut-être y a-t-il une fonction qui renvoit la date au format mysql.

Voici la structure de ma table :

Code : Tout sélectionner

CREATE TABLE `evenement` ( `id_evenement` int(11) NOT NULL auto_increment, `date` text NOT NULL, `periode` text NOT NULL, `type` text NOT NULL, `medecin` int(11) NOT NULL, PRIMARY KEY (`id_evenement`) )
Mais du coup, ma requête ressemblera à ça non ?
$req_evnm = "SELECT * FROM evenement WHERE medecin='$id_med' AND date='$date_evnm'"
Comment faire pour que cela corresponde aux jours indiqués sur la ligne du dessus, sachant qu'il n'y a pas forcément un évenement par jour ?

Merci d'avance !

par Sékiltoyai » 13 sept. 2007, 17:43

Tel qu'est ton code, il va entrer dans le for, dans la première itération du for, il va parcourir toute la requète dans le while, il va constater à chaque fois que ce n'est pas le bon jour, et il va mettre un tiret. Ensuite, une fois la requète parcourue, il va terminer la première itération du for, il va faire les autres jusqu'à la fin du for, mais à chaque fois il constatera que la requète a déjà été parcourue et passera à la suite.

Bref, ton code est entièrement faux du point de vue logique. Quand tu exécutes mysql_fetch_array(), tu lis l'enregistrement courant et le pointeur est déplacé au résultat suivant, et ce, que tu sois dans une boucle for ou non, c'est à dire que php n'a aucune raison de savoir que tu veux reparcourir la requète à chaque fois.

Donc tu dois soit modifier ta requète pour pouvoir avoir directement quelquechose d'exploitable en une seule boucle (par exemple en sélectionnant les jours et non simplement les évènements), soit modifier le code pour pouvoir parcourir les résultats de ta requète (par exemple en construisant un tableau des jours en fonction des résultats de la requète).

une boucle qui ne s'exécute pas

par Zurg » 13 sept. 2007, 13:53

Bonjour,

je reviens vers vous parce-que là, je bloque sur ce problème depuis qq jours.

Je réexplique :

je génère un tableau avec sur la première ligne une date par case correspondant au mois en cours ou selectionné (avec mktime).
Sur les 3 autres lignes, je veux insérer des enregistrements correspondants aux dates en en-tête des colonnes. Si il n'y a pas d'évènements, on affiche juste un " - ".
Je vais chercher ces enregistrements dans ma base avec une requête qui fonctionne.

Mon problème réside dans l'affichage de ces enregistrements, cela concerne cette partie du code :
// Pour la periode 1
	
	echo "<tr>";
	echo "<td align=\"center\">8h30 - 13h30</td>";
	
	// requete dans la base
	$id_med = $_SESSION['id_med'];
	$req_evnm = "SELECT * FROM evenement WHERE medecin='$id_med'";
	$rs_evnm = mysql_query($req_evnm) or die(mysql_error());
	$totalRows_req_evnm = mysql_num_rows($rs_evnm);

	for ($i=1; $i<=$nombreDeJours; $i++) {
		$date_encours = $annee."-".$month."-".$i;
		while ($row_req_evnm = mysql_fetch_array($rs_evnm)){
 			if (($row_req_evnm['periode'] == "8h30 - 13h30") && ($row_req_evnm['date'] == $date_encours)){
				// affichage
				echo "<td align=\"center\">".$row_req_evnm['type']."</td>";
			}
			else {
				echo "<td align=\"center\"> - </td>";
			}
		}
	} 
	echo "</tr>";
Le problème c'est que sur la première ligne, je n'obtiens que 5 cases remplies avec un " - ", ce qui correspond au nombre d'enregistrements répondant à la requête, et ça s'arrête là.

Je pense avoir mal bidouillé mes boucles, mais je ne sais plus trop comment m'y prendre, je retourne le pb depuis plusieurs jours, sans succès...

(je me suis permis de refaire un nouveau post sur ce sujet en étant plus explicite, vu la situation "désespérée"... si il ne fallait pas le faire, désolé, le referai pu !)

Merci de bien vouloir voler à mon secours !