8768 sujets

Développement web côté serveur, CMS

Bonjour,

Je souhaite créer un système de placement en salle pour des billets de spectacles.
J'ai un tableau HTML qui représente chaque siège de la salle. Un formulaire permet de choisir sa place (rang et numéro de siège) et enregistre la réservation en base de données.

J'aimerais que mon plan de salle affiche en rouge les sièges réservés et en blanc les sièges libres. Pour cela j'ai créé une classe "reserve" qui change le background de la cellule en rouge. Le problème c'est que je n'arrive pas à générer mes lignes de sièges (mes <tr> donc) en ayant les places réservées en rouge et toutes les autres en blanc.
Notez qu'il y a toujours 24 sièges dans un rang.

Voici mon code PHP pour l'affichage d'une ligne de tableau :

$requete = $base->query('SELECT etat FROM reservations WHERE spectacle ="concert2015"');

Plus loin dans mon tableau HTML : 
<tr>

	for($i = 24; $i > 0; $i--) {			
		while($donnees = $requete->fetch()) {
			switch($donnees['etat']) {				
				case 'abonnement':
				  echo '<td id="A'.$i.'" class="abonnement">A'.$i.'</td>';
				  break;
				case 'reserve':
				  echo '<td id="A'.$i.'" class="reserve">A'.$i.'</td>';
				  break;
				default:
				  echo '<td id="A'.$i.'">A'.$i.'</td>';
				  break;			
			}
		}
	}
</tr>


Merci d'avance de votre aide
Modifié par Javert67 (25 Sep 2015 - 14:05)
Hello,

je te propose ça, j'ai pas testé mais ca devrait je l'espère fonctionner.


<tr>
<?php
 $requete = $base->query('SELECT etat FROM reservations WHERE spectacle ="concert2015"');
 
 $i=0;
 while($donnees = $requete->fetch()) {
	switch($donnees['etat']) {				
		case 'abonnement':
		echo '<td id="A'.$i.'" class="abonnement">A'.$i.'</td>';
		break;
			
		case 'reserve':
		echo '<td id="A'.$i.'" class="reserve">A'.$i.'</td>';
		break;
		
		default:
		echo '<td id="A'.$i.'">A'.$i.'</td>';
		break;			
	}
	
	if ($i%24 == 0) {
		echo '</tr><tr>';
	}

	$i++;
}
?>
</tr>
Merci pour votre réponse,

Malheureusement cela ne fonctionne pas.
Je n'ai pas compris la ligne

if ($i%24 == 0) {
	echo '</tr><tr>';
}


Normalement j'aimerai dupliquer le code pour chaque ligne, je veux juste générer les <td>
Modérateur
Bonjour,


Du coup c'est l'affichage de tes <td> qui bloque c'est ça ?

A la place du switch je serais parti sur un "if/else" plutôt pour imprimer seulement la classe.

Ou sinon plus radical du genre :
echo '<td id="A' . $i . '" class="' . $donnees['etat'] . '">A' . $i . '</td>';

Mais il faut être sur que $donnees['etat'] ne renvoie bien qu'un seul mot sans espace.

D’ailleurs es-tu sur du contenu de $donnees['etat'] ?

Javert67 a écrit :
Normalement j'aimerai dupliquer le code pour chaque ligne, je veux juste générer les <td>
Préfère une boucle à la duplication quand même Smiley langue
Le problème c'est que les places libres ne sont pas dans la base de données.
Du coup ma boucle while n'affiche que les places réservées.
Comment arriver à toujours afficher 24 cases dans la ligne (même sans qu'elles ne soient dans la base) tout en remplissant de vert les bonnes cases réservées ?

Voici le plan en question qui est un simple tableau HTML. Chaque siège est une case <td> dans une ligne horizontale <tr>
upload/39151-Sanstitre-.jpg
Modérateur
Ah bah du coup il faut que tu fasse une boucle for() de 0 à 24 et a chaque itération tu regarde avec un if() s'il existe une réservation dans ta base pour ce siege. Si c'est oui tu affiche un siege avec l'état qui va bien, si c'est non, le else met juste un siege normal.
Merci beaucoup. Du coup voici mon nouveau code

$requete = $base->query('SELECT * FROM reservations WHERE spectacle ="concert"');
$donnees = $requete->fetch();

.......................
<tr>
<?php 
	for($i = 24; $i > 0; $i--) {
	   if($donnees['etat'] == 'reserve') {
		echo '<td class="reserve"  id="d'.$i.'">'.$i.'</td>';	
	   }
	   else {
		echo '<td id="d'.$i.'">'.$i.'</td>';	
	   }
	}
?>
</tr>


Sauf que pour l'instant tous mes sièges se mettent en "réservé" alors qu'il ne devrait y en avoir qu'un, le D19
Modérateur
Alors, je m'en doutais déjà lors de mon dernier post mais je n'en était pas sur.
Que contient $données ?
Parce-que $donnees['etat'] ne fait référence a aucun siege...
il y a un endroit dans ta base ou tu sais que c'est le siège D19 qui est réservé ?
Normalement ton SELECT * FROM reservations WHERE spectacle ="concert" devrait te retourner la liste des sièges réservés pas seulement "réservé" sans indiquer le siège... vois-tu ? Le if doit regarder sir le siège $i est réservé.
IL faut commencer par nous expliquer ce que contient ta table et par conséquent les données récupérées.

Je suppose que ta table doit ressembler à quelque chose comme ceci, c'est l'organisation la plus logique pour ton problème :

create table reservations (
spectacle int, # clé étrangère
siege varchar(4),
etat enum('libre', 'reserve'),
primary key(spectacle, siege)
);


Du coup ton premier objectif est de constituer un array contenant les numéros de toutes les places occupées. Une fois que tu as ça, générer ton tableau c'est facile, tu as juste à vérifier si la place est dans le tableau des places occupées ou non.

Pour récupérer ton tableau de places occupées, quelque chose comme ceci devrait fonctionner (je suppose que tu utilises PDO) :

$reserves = $db->query("select siege from reservations where spectacle = 123 and etat = 'reserve' ");
$reserves->setFetchMode(PDO::FETCH_COLUMN,0);
$reserves = $reserves->fetchAll();


Et après c'est très simple, tu as juste besoin de la fonction in_array.