sortir une variable d'une boucle

VaN
Mammouth du PHP | 1107 Messages

03 nov. 2005, 17:24

<?php
while($result_res = mysql_fetch_array($query_res))
					{
					
						for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						{ 
					
							if (($a-1) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
						
							echo "<td title=\"".$result_res['username']."\"><img src=\"pc_res.gif\" width=\"13\" /></td>"; 
					
						}

						for ($nb_cases=$a;$nb_cases<=18;$nb_cases+=1)
						{ 
							if (($nb_cases-1) % 6 ==0)
							{
								echo "</tr><tr>";
							} 
							//construction cellule blanche 
							echo "<td></td>"; 
						}
					
					}
?>
je souhaiterais sortir la valeur de $a du if() à la fin de la premier boucle du while, pour le réutiliser, et faire commencer le if() de la deuxieme boucle du while() avec ette valeur. Comment puis-je faire ça ? Est ce possible d'abord ?

edit : voici ce que mon code donne : http://vanwork.nuxit.net/goodgame/calen ... ndar01.jpg pour le moment sur le vendredi 4. Or, j'aimerais que toutes les cases rouges soient les unes à la suite des autres (6 colonnes au max, ensuite ça passe à la ligne, mais cette partie à deja été développée), il faudrait dond que je puisse reutiliser $a dans tous les if(), pour pas qu'il revienne à la ligne à chaque fois.
Modifié en dernier par VaN le 03 nov. 2005, 17:49, modifié 1 fois.

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

03 nov. 2005, 17:49

De toute façons, un break suffit pour arrêter à volonté la boucle for et continuer le traitement après sa fin.

Mais ...
Si tu explique ce que tu veux faire, on pourrait modifier ton programme au lieu de faire ce genre d'arrêt de boucle qui si non maitrisé fraude la loi du bouclage.

En effet, dans ton programme, si tu arrête la première boucle dans le if du premier for:
if (($a-1) % 6 == 0) 
   { 
         echo "</tr><tr>"; 
         break;
    }
la boucle ne termine jamais le cycle prévu : $a<=$result_res['nb_pc']
et donc ça ne sert à rien de programmer une telle boucle car au premier $a=1 la boucle termine.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

VaN
Mammouth du PHP | 1107 Messages

03 nov. 2005, 18:22

alors, je vais tenter de t'expliquer ce que je dois obtenir au final, de la manière la plus simple possible :

déjà, il faut se reporter a l'image suivante http://vanwork.nuxit.net/goodgame/calen ... ndar01.jpg pour comprendre tout le bouzin.

Dans la case vendredi 4, il y'a un tableau, généré dynamiquement. Ce tableau possède en tout 6 colonnes et 3 lignes (18 cellules), et deux types de cellules : des rouges et des blanches.

J'extrait une variable de ma base de données ($pc_libres), j'en deduit le nombre de pc réservés ($pc_res = 18 - $pc_libres), et j'affiche autant de cellules en rouges que le nombre contenus dans $pc_res. Donc chaque cellule rouge représente un pc réservé. Le reste des cellules sont blanches, pour les pc libres.

De plus, sur chaque cellule, je fait un attribut title qui va contenir le pseudo de la personne qui a reservé ce pc. Vu qu'il y'a parfois, pour une meme journée, plusieurs reservations faites par des pseudo différents, j'ai du appliquer un while autour de tout ça, pour boucler sur le nombre de reservations différentes.

Et pour le moment, pour chaque pseudo différent, le tableau passe à la ligne suivante, au lieu de finir de remplir la ligne en cours, avec les pc reservés de la reservation suivante.

Voila, j'espere que c'est assez clair. Je met l'ensemble du code qui permet de générer tout ça :
<table width="100%"  border="1" align="center">
  					<tr>
					<?php
					$date = $current_year."-".$current_month."-".$i;
					$sql_check_soiree = "SELECT id_soiree, date, pc_libres
										FROM  calendar_soiree
										WHERE date='".$date."'";
					$query_check_soiree = mysql_query($sql_check_soiree);
					if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
					{
						
						$soiree = 1;
						// on recupere le nombre de pc libres pour cette soirée
						$pc_libres = $result_check_soiree['pc_libres'];
					}
					else
					{
						$soiree = 0;
						$pc_libres = '18';
					}
					
					$pc_res = 18 - $pc_libres;
					
					// on recupere l'id_user de chaque reservation sur la soirée donnée
					$sql_res = 	"SELECT id_res, id_user, nb_pc, username
								FROM calendar_reservation, frm_users
								WHERE id_soiree=".$result_check_soiree['id_soiree']."
								AND calendar_reservation.id_user = frm_users.user_id
								ORDER BY id_res";
					$query_res = mysql_query($sql_res);
					
					// si la requete renvoie quelquechose, on execute la boucle
					if ($query_res)
					{
						while($result_res = mysql_fetch_array($query_res))
						{	
							for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
							{ 
								if (($a-1) % 6 == 0)
								{
									echo "</tr><tr>";
								} 
								echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"pc_res.gif\" width=\"13\" /></td>"; 
							}
						}
						for ($nb_cases=$a;$nb_cases<=18;$nb_cases+=1)
						{ 
							if (($nb_cases-1) % 6 ==0)
							{
								echo "</tr><tr>";
							}
							//construction cellule blanche 
							echo "<td></td>"; 
						}
						
					}
					?>
  					</tr>
				</table>

Mammouth du PHP | 1311 Messages

03 nov. 2005, 18:31

maintenant que l'on a ton code et tes explication comment est structurer ta base(une modelisation, pas 100lignes)

VaN
Mammouth du PHP | 1107 Messages

03 nov. 2005, 18:41

j'ai trois tables, construites ainsi :

calendar_reservation
id_res
id_user
id_soiree
date
nb_pc
h_arrivee
h_depart

calendar_soiree
id_soiree
date
pc_libres

frm_users
user_id
user_prenom
user_nom
username
user_password
user_email
user_tel
user_age

VaN
Mammouth du PHP | 1107 Messages

04 nov. 2005, 15:00

je n'ai toujours pas réussi à trouver comment réaliser ce que je souhaite faire : (

Eléphant du PHP | 153 Messages

04 nov. 2005, 15:18

J'ai relu ton code et ta question et je ne comprend vraiment pas le problème peux tu tenter de reexpliquer Désolé

VaN
Mammouth du PHP | 1107 Messages

04 nov. 2005, 15:25

en fait il suffit juste de se référer à cette image :

http://vanwork.nuxit.net/goodgame/calen ... ndar01.jpg

Ne pas s'occuper de tous les messages d'erreur sur l'image, ce n'est pas important du tout.

Mon code génère le tableau qu'on voit au vendredi 4.
Or, j'aimerais que les cellules rouges soit placées les unes à la suite des autres, jusqu'a atteindre la limite de 6 colonnes, et seulement là, le tableau va à la ligne.

le probleme actuel est lorsque je sors du if(), le tableau inscrit le </tr><tr>, et relance la boucle à partir de $a=1

Enfin, j'imagine que le probleme est la.

Eléphant du PHP | 353 Messages

04 nov. 2005, 15:29

Je pense que tu as un problème de logique. Avant de coder essaie d'écrire sur le papier ce que doit faire ton script!

Ta boucle for à l'intérieur de la boucle while ne sert à rien.
Cela devrait plutôt ressembler à ça:

n = 1
while (liste des enregistrement) {
afficher la cellule.
si n est un multiple de 6 alors
faire une nouvelle ligne
n = n+1
}

VaN
Mammouth du PHP | 1107 Messages

04 nov. 2005, 15:50

non pas tout à fait. la boucle que tu me propose, c'et ce que j'avais avant, même elle ne prenait pas en compte par qui avait été faite la reservation.

j'ai uploadé tout ça sur mon serveur pour que ça soit plus aisé :

mon script avec le while() et le for() : http://vanwork.nuxit.net/goodgame/calen ... isplay.php
Quand on passe la souris sur les cases du vendredi 4, on voit par qui la réservation a été faite.
<table width="100%"  border="1" align="center">
				<tr>
				<?php
				$date = $current_year."-".$current_month."-".$i;
				$sql_check_soiree = "SELECT id_soiree, date, pc_libres
									FROM  calendar_soiree
									WHERE date='".$date."'";
				$query_check_soiree = mysql_query($sql_check_soiree);
				if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
				{
					
					$soiree = 1;
					// on recupere le nombre de pc libres pour cette soirée
					$pc_libres = $result_check_soiree['pc_libres'];
				}
				else
				{
					$soiree = 0;
					$pc_libres = '18';
				}
				
				$pc_res = 18 - $pc_libres;
				
				// on recupere l'id_user de chaque reservation sur la soirée donnée
				$sql_res = 	"SELECT id_res, id_user, nb_pc, username
							FROM calendar_reservation, frm_users
							WHERE id_soiree=".$result_check_soiree['id_soiree']."
							AND calendar_reservation.id_user = frm_users.user_id
							ORDER BY id_res";
				$query_res = mysql_query($sql_res);
				
				// si la requete renvoie quelquechose, on execute la boucle
				if ($query_res)
				{	
					while($result_res = mysql_fetch_array($query_res))
					{	
						for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						{ 
							if (($a-1) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" /></td>"; 
						}
					}
					for ($nb_cases=$n;$nb_cases<=18;$nb_cases+=1)
					{ 
						if (($nb_cases-1) % 6 ==0)
						{
							echo "</tr><tr>";
						}
						//construction cellule blanche 
						echo "<td></td>"; 
					}
					
				}
				?>
				</tr>
		</table>
le script sans le for() : http://vanwork.nuxit.net/goodgame/calen ... splay2.php Il ne marche pas très bien, vu qu'il y'a 3 pc reservé par VaN et 5 par RoB dans ma base de données (le script du dessu par contre l'affiche correctement)
<table width="100%"  border="1" align="center">
				<tr>
				<?php
				$date = $current_year."-".$current_month."-".$i;
				$sql_check_soiree = "SELECT id_soiree, date, pc_libres
									FROM  calendar_soiree
									WHERE date='".$date."'";
				$query_check_soiree = mysql_query($sql_check_soiree);
				if ($result_check_soiree = mysql_fetch_array($query_check_soiree))
				{
					
					$soiree = 1;
					// on recupere le nombre de pc libres pour cette soirée
					$pc_libres = $result_check_soiree['pc_libres'];
				}
				else
				{
					$soiree = 0;
					$pc_libres = '18';
				}
				
				$pc_res = 18 - $pc_libres;
				
				// on recupere l'id_user de chaque reservation sur la soirée donnée
				$sql_res = 	"SELECT id_res, id_user, nb_pc, username
							FROM calendar_reservation, frm_users
							WHERE id_soiree=".$result_check_soiree['id_soiree']."
							AND calendar_reservation.id_user = frm_users.user_id
							ORDER BY id_res";
				$query_res = mysql_query($sql_res);
				
				// si la requete renvoie quelquechose, on execute la boucle
				if ($query_res)
				{	
					$n = 1;
					while($result_res = mysql_fetch_array($query_res))
					{	
						//for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						//{ 
							if (($n/*-1*/) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" /></td>"; 
						//}
					$n = $n + 1;
					}
					for ($nb_cases=$n;$nb_cases<=18;$nb_cases+=1)
					{ 
						if (($nb_cases-1) % 6 ==0)
						{
							echo "</tr><tr>";
						}
						//construction cellule blanche 
						echo "<td></td>"; 
					}
					
				}
				?>
				</tr>
			</table>

VaN
Mammouth du PHP | 1107 Messages

04 nov. 2005, 16:10

en trifouillant un peu, j'ai réussi a afficher les cases exactement de la manière dont je voulais qu'elles s'affichent. comme ça, sur la case du vendredi 4 : http://vanwork.nuxit.net/goodgame/calen ... splay3.php

pour obtenir ce resultat, j'ai changer
<?php
if (($a-1) % 6 == 0)
{
	echo "</tr><tr>";
}
en
if (($a+2) % 6 == 0)
{
	echo "</tr><tr>";
} 
Or, je suis à peu près persuadé que ce n'est pas la bonne methode, car cela ne fonctionne pas pour les autres cases. Mais au moins cela permet de voir ce qu'il faudrait que ça fasse

je suis à peu près sur que la solution réside dans le fait de sortir le $a du if(), pour le reutiliser dans le prochain tour de if(), pour ne pas revenir à la ligne.

VaN
Mammouth du PHP | 1107 Messages

04 nov. 2005, 17:32

Je vais encore tenter de simplifier mon probleme :

Sur cette page, http://vanwork.nuxit.net/goodgame/calen ... isplay.php, dans la case du vendredi 4, au lieu d'avoir :

-------------------------
| 1 | 2 | 3 |
| 1 | 2 | 3 | 4 | 5 |
-------------------------

j'aimerais avoir

-------------------------
| 1 | 2 | 3 | 4 | 5 | 6 |
| 7 | 8 |
--------------------------

a chaque fois que le chiffre est un multiple de 6, le tableau retourne à la ligne.

le code actuel :
<?php
while($result_res = mysql_fetch_array($query_res))
					{	
						for ($a=1; $a<=$result_res['nb_pc']; $a+=1)
						{
							if (($a-1) % 6 == 0)
							{
								echo "</tr><tr>";
							} 
							echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" />$a</td>"; 
						}
					}
?>

Mammouth du PHP | 19672 Messages

05 nov. 2005, 09:43

Tiens, voilà un exemple pour illustrer le principe complet, à toi de l'dapter à tes besoins:
<?php
$tableau = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24");
for($i = 0; $i < 24; $i++)
{
    /* On vérifie si on est au premier élément d'une ligne pour ouvrir la ligne du tableau, le reste de $i par 6 */
    echo(($i % 6 == 0) ? "  <tr>\n" : "");
    /* On ajoute l'élément */
    echo("    <td>". $tableau[$i] ."</td>\n");
    /* On vérifie si on est au dernier élément de la ligne, donc le reste de ($i - 1) par 6 */
    echo((($i + 1) % 6 == 0) ? "  </tr>\n" : "");
}
?>
Ce code va générer un tableau de six colonnes de large. Attention, si le nombre d'éléments ne correspond pas à un multiple de 6, il faudra ajouter d'autres éléments pour créer des cellules vides et compléter la structure du tableau en structure conforme.
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

07 nov. 2005, 18:24

Je croix que tu doit intégrer une sous-table dans la case où tu liste les images "carré rouge". to code est correct, il faut simplement ajouter :
un echo "<table>"; avant la boucle de $a et un echo "</table>" après
ça va donner ça :
<?php 
while($result_res = mysql_fetch_array($query_res)) 
                    {
                       echo "<table>";     
                        for ($a=1; $a<=$result_res['nb_pc']; $a+=1) 
                        { 
                            if (($a-1) % 6 == 0) 
                            { 
                                echo "</tr><tr>"; 
                            } 
                            echo "<td title=\"r&eacute;serv&eacute; par ".$result_res['username']."\"><img src=\"img/pc_res.gif\" width=\"13\" />$a</td>"; 
                        } 
                       echo "</table>";
} 
?>
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

VaN
Mammouth du PHP | 1107 Messages

07 nov. 2005, 18:54

@ sadeq : je n'obtiens pas vraiment le resultat désiré :lol:

http://vanwork.nuxit.net/goodgame/calen ... isplay.php
Tiens, voilà un exemple pour illustrer le principe complet, à toi de l'dapter à tes besoins:
<?php
$tableau = array("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24");
for($i = 0; $i < 24; $i++)
{
    /* On vérifie si on est au premier élément d'une ligne pour ouvrir la ligne du tableau, le reste de $i par 6 */
    echo(($i % 6 == 0) ? "  <tr>\n" : "");
    /* On ajoute l'élément */
    echo("    <td>". $tableau[$i] ."</td>\n");
    /* On vérifie si on est au dernier élément de la ligne, donc le reste de ($i - 1) par 6 */
    echo((($i + 1) % 6 == 0) ? "  </tr>\n" : "");
}
?>
Ce code va générer un tableau de six colonnes de large. Attention, si le nombre d'éléments ne correspond pas à un multiple de 6, il faudra ajouter d'autres éléments pour créer des cellules vides et compléter la structure du tableau en structure conforme.
Ca je le comprends bien je pense. C'est le niveau 1 de mon script. Mais la où le bas blesse, c'est que cette boucle, est elle-même comprise dans une autre boucle, parce que chaque case n'est pas liée au meme USER_ID, il me faut donc une boucle pour le USER_ID 1, puis une boucle pour le USER_ID 2, etc.. et c'est la que ça ne marche plus, pour fait le lien entre la fin de la boucle pour ID 1 et le debut de la boucle pour ID 2.