Bonjour,
J'ai un souci pour compter les nombre de fois qu'il y d'entrée correspondant a 2 index 'dateresa' et 'alvéole', et trier tout ça par l'index date c'est pas claire, je sais! mais pas facile a expliquer.
Voici le code php pour lequel j'ai le meilleur résultat pour l'instant, mais le souci en question c'est qu'il me classe bien les dates et compte bien le nombre d'entrée par alvéole mais il m'affiche autant de fois le résultat quil y a de résultat, c'est encore moins claire :(
Pour info le champs 'dateresa' est en varchar pas en date dans a bdd.
<!-- Alvéole 1 -->
<div id="alveolehide1"class="infoalv1 infoalv1bull1 alveole">
<span>
<?php
$iduser = $_SESSION['id'];
$listresa = $bdd->prepare('SELECT * from reservation WHERE iduser ORDER BY dateresa DESC');
$listresa->execute(array($iduser));
?>
<div class="table-responsive">
<table class="table">
<thead>
<tr class="table-danger">
<th>Nombre de reservation par date</th>
</tr>
</thead>
<tbody id="myTable">
<?php
$i=0;
if($listresa){
$currentDate = false;
while($resaList = $listresa->fetch(PDO::FETCH_ASSOC)) { ?>
<?php if ($resaList['alveole'] == 1) {
$i++;
if ($resaList['dateresa'] != $currentDate) {
?>
<tr class="" >
<th class="dropdown-toggle" colspan='1' data-toggle="collapse" data-target="#collapseDate1" aria-expanded="false" aria-controls="collapseDate"><?php echo $resaList['dateresa']; ?></th>
</tr>
<?php $currentDate = $resaList['dateresa'];
}
?>
<tr class="collapse" id="collapseDate1">
<?php
$nbdate = $resaList['dateresa'];
$nbalv = 1;
$compte = $bdd->query("SELECT COUNT(*) as nombre FROM reservation WHERE dateresa='$nbdate' AND alveole='$nbalv' ");
$compteresa = $compte->fetchColumn();
?>
<td><?php echo $compteresa; ?></td>
<?php }}}; ?>
</tbody>
</table>
</div>
</span>
</div>
Voici le résultat obtenu:
Alveole 1
Nombre de reservation par date
31/05/2020
1
30/05/2020
2
2
24/05/2020
1
21/06/2020
5
5
5
5
5
Voici le résultat souhaitez:
Alveole 1
Nombre de reservation par date
31/05/2020
1
30/05/2020
2
24/05/2020
1
21/06/2020
5
Merci de votre aide.
Salut,
Premièrement, ta requête SELECT * from reservation WHERE iduser ORDER BY dateresa DESC
est fausse, il manque la valeur pour la condition iduser
Hello,
Jai modifié comme suit, c'est mieux?
A ce niveau je n'ai pas vraiment besoin du champs iduser.
En tout cas ça ne change pas, toujours le meme probleme avec le meme résultat
$alveole = 1;
$listresa = $bdd->prepare('SELECT * from reservation ORDER BY dateresa, alveole DESC');
$listresa->execute(array($alveole));
?>
Peut être en ajoutant un group by
sur dateresa
si ce champ n'est pas unique
SELECT * from reservation WHERE iduser GROUP BY dateresa ORDER BY dateresa DESC
Salut,
ça fonctionne, j'ai donc dupliqué ça autant de fois que j'en avait besoin c'est cool, merci a tout les deux, par contre j'ai juste oublié de faire des conditions pour des reservation matin et apres midi et la j'ai pas réussi a mettre les bonnes condition pour que tout les cas soit pris en compte.
je souhaite pouvoir gerer et afficher tout les cas possible:
Pour chaque jour le nombre de reservation pour:
Si AM = 1 afficher ==> 1 place réservée de 09h-12h
Si AM = plus de 1 afficher ==> X nombre places réservées de 09h-12h
Si PM = 1 afficher ==> 1 Places réservées pour 14h-17h
Si PM = plus de 1 afficher ==> X nombre places réservées de 09h-12h
Si AM = 1 et PM = 1 afficher ==>
1 place réservée de 09h-12h
1 Place réservée pour 14h-17h
Si AM = plus de 1 et PM = plus de 1 afficher ==>
X nombre places réservées de 09h-12h
X nombre Places réservées pour 14h-17h
Si la meme personne selectionne les 2 plages horaire j'ai codé pour que ca soit sur la meme ligne dans la bdd donc AM et PM a on.
Je ne sais pas comment gerer ça.
Et j'en oubli peut etre!
Voici le code:
<?php
$alveole = 1;
$listresa = $bdd->prepare('SELECT * from reservation WHERE alveole GROUP BY dateresa ORDER BY dateresa DESC');
$listresa->execute(array($alveole));
?>
<div class="table-responsive">
<tr>
<td><i class="fas fa-ruler-combined"></i>Alvéole 1 de 24X23 mètres</td><br>
<td>Ouverte au Handgun et PCC</td><br>
<td>Ouverte au shotgun le samedi sous responsabilité d’un moniteur</td><br>
</tr>
<br>
<table class="table">
<thead>
<tr class="table-danger">
<th>Réservation par date</th>
</tr>
</thead>
<tbody id="myTable">
<?php
$i=0;
if($listresa){
$currentDate = false;
while($resaList = $listresa->fetch(PDO::FETCH_ASSOC)) {
if ($resaList['alveole'] == 1) {
$i++;
if ($resaList['dateresa'] != $currentDate) {
?>
<tr class="" >
<td class="dropdown-toggle" colspan='1' data-toggle="collapse" data-target="#collapseDate1" aria-expanded="false" aria-controls="collapseDate"><?php echo $resaList['dateresa']; ?></td>
</tr>
<?php $currentDate = $resaList['dateresa'];
}
?>
<tr class="collapse" id="collapseDate1">
<?php
$nbdate = $resaList['dateresa'];
$nbalv = 1;
$compte = $bdd->query("SELECT COUNT(*) as nombre FROM reservation WHERE dateresa='$nbdate' AND alveole='$nbalv'");
$compteresa = $compte->fetchColumn();
if ($resaList['AM'] == 'on' && $compteresa == 1) {?>
<td><?php echo $compteresa ," place réservée de 09h-12h"; ?></td>
<?php }elseif ($resaList['PM'] == 'on' && $compteresa == 1){?>
<td><?php echo $compteresa ," Place réservée de 14h-17h"; ?></td>
<?php }elseif ($resaList['AM'] == 'on' && $compteresa > 1) {?>
<td><?php echo $compteresa ," places réservées pour 09h-12h"; ?></td>
<?php }elseif ($resaList['PM'] == 'on' && $compteresa > 1) {?>
<td><?php echo $compteresa ," Places réservées pour 14h-17h"; ?></td>
<?php} else{
($compteresa == 0) { ?>
<td><?php echo $compteresa ," Pas de réservation"; ?></td>
<?php }
}
}}; ?>
</tbody>
</table>
</div>
</span>
</div>
Test pour :
30/05/2020 09h-12h
30/05/2020 09h-12h/14h-17h
30/05/2020 14h-17h
Résultat obtenu
Réservation par date
30/05/2020
3 places réservées pour 09h-12h
Résultat souhaité
Réservation par date
30/05/2020
2 places réservées pour 09h-12h
2 places réservées pour 14h-17h
J'ai tester d'autre chose avec des résultats diffférents mais toujours pas bon voici un autre.
Je mets que les conditions:
test pour
30/08/2020 09h-12h/14h-17h
30/08/2020 09h-12h
résultat obtenu:
Nombre de reservation par date
30/08/2020
2 places réservées pour 09h-12h 2 Places réservées pour 14h-17h
résultat attendu:
Nombre de reservation par date
30/08/2020
2 places réservées pour 09h-12h 1 Places réservées pour 14h-17h
Le deuxieme codes
<?php if ($compteresa == 0) {?>
<td><?php echo $compteresa ," Pas de réservation"; ?></td>
<?php } ?>
<?php if ($resaList['AM'] == 'on') {?>
<?php if ($compteresa == 1) {?>
<td><?php echo $compteresa ," place réservée pour 09h-12h"; ?></td><br>
<?php }else
{?>
<td><?php echo $compteresa ," places réservées pour 09h-12h"; ?></td>
<?php } ?>
<?php } ?>
<?php if ($resaList['PM'] == 'on') {?>
<?php if ($compteresa == 1) {?>
<td><?php echo $compteresa ," place réservée pour 14h-17h"; ?></td><br>
<?php }else
{?>
<td><?php echo $compteresa ," places réservées pour 14h-17h"; ?></td>
<?php } ?>
<?php } ?>
Hello,
La voici
== Structure de la table reservation ------ Colonne Type Null Valeur par défaut //id// int(11) Non prenom varchar(255) Non nom varchar(255) Non alveole varchar(6) Non firetype varchar(255) Non datecreation datetime Oui NULL AM varchar(255) Oui NULL PM varchar(255) Oui NULL statut varchar(255) Oui NULL dateresa varchar(255) Oui NULL iduser int(11) NonHello,
J'ai essayé cette requete mais je ne sais apparemment comment l'utiliser et elle me genere un message d'erreur avec ou sans le group by daterea, aleveole:
Dois-je ensuite faire $compteresa = $compte->fetchColumn(); et ensuite faire des conditions?
$compte = $bdd->query("SELECT
sum(CASE WHEN AM is not null THEN 1 else 0) am_count,
sum(CASE WHEN PM is not null THEN 1 else 0) pm_count
FROM reservation
WHERE dateresa='$nbdate'
AND alveole='$nbalv'
group by daterea, aleveole");
J'ai lerreur suivante a la ligne 660 qui correspond a AND alveole='$nbalv':
Fatal error: in C:\wamp64\www\TsvStageMakerResponsive\reservation_alveoles.php on line <i>660
PDOException: in C:\wamp64\www\TsvStageMakerResponsive\reservation_alveoles.php on line <i>660
Salut Merci du retour,
Bon j'ai plus d'erreur mais je vois pas comment l'utilser il y a quelque chose qui ne va pas dans if elseif non?.
J'ai rendu la tache un peu moins dfficile, j'ai modifier la gestion des checkbox, on ne eut maintenant selectionné qu'une suel plage horaire donc maintenant il a plus que AM ou PM a "on" par ligne dans la bdd:
voci ce que j'ai tester;
<table class="table">
<thead>
<tr class="table-danger">
<th>Réservation par date</th>
</tr>
</thead>
<tbody id="myTable">
<?php
$i=0;
if($listresa){
$currentDate = false;
while($resaList = $listresa->fetch(PDO::FETCH_ASSOC)) {
if ($resaList['alveole'] == 1) {
$i++;
if ($resaList['dateresa'] != $currentDate) {
?>
<tr class="" >
<td class="dropdown-toggle" colspan='1' data-toggle="collapse" data-target="#collapseDate1" aria-expanded="false" aria-controls="collapseDate"><?php echo $resaList['dateresa']; ?></td>
</tr>
<?php $currentDate = $resaList['dateresa'];
}
?>
<tr class="collapse" id="collapseDate1">
<?php
$nbdate = $resaList['dateresa'];
$nbalv = 1;
$compte = $bdd->query("SELECT dateresa, alveole,
sum(CASE WHEN AM is not null THEN 1 else 0 end) am_count,
sum(CASE WHEN PM is not null THEN 1 else 0 end) pm_count
FROM reservation
group by dateresa, alveole
order by dateresa, alveole");
$compte = $bdd->query("SELECT COUNT(*) as nombre FROM reservation WHERE dateresa='$nbdate' AND alveole='$nbalv'");
$compteresa = $compte->fetchColumn();
if ($resaList['AM'] == 'on' && $compteresa == 1) {?>
<td><?php echo $compteresa ," place réservée de 09h-12h"; ?></td>
<?php }elseif ($resaList['PM'] == 'on' && $compteresa == 1){?>
<td><?php echo $compteresa ," Place réservée de 14h-17h"; ?></td>
<?php }elseif ($resaList['AM'] == 'on' && $compteresa > 1) {?>
<td><?php echo $compteresa ," places réservées pour 09h-12h"; ?></td>
<?php }elseif ($resaList['PM'] == 'on' && $compteresa > 1) {?>
<td><?php echo $compteresa ," Places réservées pour 14h-17h"; ?></td>
<?php} else{
($compteresa == 0) { ?>
<td><?php echo $compteresa ," Pas de réservation"; ?></td>
<?php }
}
}}; ?>
</tbody>
</table>
Le résultat n'est tpujpurs pas bon
Résultat:
Réservation par date
31/05/2020
3 places réservées pour 09h-12h
Alors que dans la bdd ily a:
31/05/2020 AM = on et PM = 0
31/05/2020 PM = on et AM = 0
31/05/2020 AM = on et PM = 0
Hello,
Désolé lolo3129,, j'ai pas réussi a utiliser ta requette.
Bon je n'y arrive pas malgré les différents test, si quelqu'un a une idée voir la solution.
J'ai essayé beaucoup de chose, voici un récap.
Je souhaite affichier le nombre de champs "AM" et "PM" separément et tout ça trié par un autre champs "dateresa" qui est une date mais qui est en varchar dans la db, les champs "AM" et "PM" sont des checkbox il sont enregistré dans la db en "on" si coché et "0" si pas coché.
Voici la table
== Structure de la table reservation
|------
|Colonne|Type|Null|Valeur par défaut
|------
|//**id**//|int(11)|Non|
|prenom|varchar(255)|Non|
|nom|varchar(255)|Non|
|alveole|varchar(6)|Non|
|fype|varchar(255)|Non|
|datecreation|datetime|Oui|NULL
|AM|varchar(255)|Oui|NULL
|PM|varchar(255)|Oui|NULL
|statut|varchar(255)|Oui|NULL
|dateresa|varchar(255)|Oui|NULL
|iduser|int(11)|Non|
== Déchargement des données de la table reservation
|86|test|test1|1|1|2020-05-31 10:08:23|on|0|confirme|06/06/2020|1
|87|test|test1|1|1|2020-05-31 10:09:16|on|0|confirme|06/06/2020|1
|88|test|test1|1|1|2020-05-31 10:10:37|0|on|nonconfirme|06/06/2020|1
|89|test|test1|1|1|2020-05-31 10:13:34|0|on|nonconfirme|06/06/2020|1
Voici le code que j'ai essayé de séparer entre AM et PM.
<!-- Alvéole 1 -->
<div id="alveolehide1"class="infoalv1 infoalv1bull1 alveole">
<span>
<?php
$alveole = 1;
$listresa = $bdd->prepare('SELECT * from reservation WHERE alveole GROUP BY dateresa ORDER BY dateresa DESC');
$listresa->execute(array($alveole));
?>
<div class="table-responsive">
<tr>
<td><i class="fas fa-ruler-combined"></i>Alvéole 1 de 24X23 mètres</td><br>
<td>Ouverte au Handgun et PCC</td><br>
<td>Ouverte au shotgun le samedi sous responsabilité d’un moniteur</td><br>
</tr>
<br>
<table class="table">
<thead>
<tr class="table-danger">
<th colspan='2'>Réservation par date</th>
</tr>
</thead>
<tbody id="myTable">
<?php
$i=0;
if($listresa){
$currentDate = false;
while($resaList = $listresa->fetch(PDO::FETCH_ASSOC)) {
if ($resaList['alveole'] == 1) {
$i++;
if ($resaList['dateresa'] != $currentDate) {
?>
<tr class="" >
<td class="dropdown-toggle" colspan='2' data-toggle="collapse" data-target="#collapseDate1" aria-expanded="false" aria-controls="collapseDate"><?php echo $resaList['dateresa']; ?></td>
</tr>
<?php $currentDate = $resaList['dateresa'];
}
?>
<tr class="collapse" id="collapseDate1">
<?php
$nbdate = $currentDate;
$nbalv = 1;
$AM = $resaList['AM'];
$compte = $bdd->query("SELECT COUNT(*) as nombre FROM reservation WHERE dateresa='$nbdate' AND alveole='$nbalv' AND AM='$AM'");
$compteresa = $compte->fetchColumn();
if ($resaList['AM'] == 'on' && $compteresa == 1) {?>
<td><?php echo $compteresa ," réservation pour 09h-12h"; ?></td>
<?php }else{?>
<td><?php echo $compteresa ," réservations pour 09h-12h"; ?></td>
<?php } ?>
<?php
$nbdate = $currentDate;
$nbalv = 1;
$PM = $resaList['PM'];
$compte = $bdd->query("SELECT COUNT(*) as nombre FROM reservation WHERE dateresa='$nbdate' AND alveole='$nbalv' AND PM='$PM'");
$compteresa = $compte->fetchColumn();
if ($resaList['PM'] == 'on' && $compteresa == 1) {?>
<td><?php echo $compteresa ," réservation de 14h-17h"; ?></td>
<?php }else{?>
<td><?php echo $compteresa ," réservations pour 14h-17h"; ?></td>
<?php } ?>
</tr>
<?php }}}; ?>
</tbody>
</table>
</div>
</span>
</div>
Voici le resultat obtenu qui est pas bon:
Réservation par date
06/06/2020
4 réservations pour 09h-12h - 4 réservations pour 14h-17h
Voici le resultat souhaité:
Réservation par date
06/06/2020
2 réservations pour 09h-12h - 2 réservations pour 14h-17h
Salt lolo,
Oui j'avais essayé mais comme je te dit je n'arrive pas a l'utiliser je un message d'erreur:
Jutilise deja PHPMyAdmin avec PDO.
Voici le message d'erreur:
Warning: Illegal string offset 'am_count' in C:\wamp64\www\TsvStageMakerResponsive\reservation_alveoles.php on line 742
Warning: Illegal string offset 'pm_count' in C:\wamp64\www\TsvStageMakerResponsive\reservation_alveoles.php on line 748
Avec $compteresa['am_count'] et $compteresa['pm_count']
ou
Pareil avec ==> $resaList['am_count'] et $resaList['pm_count']
Voici le code:
<tbody id="myTable">
<?php
$i=0;
if($listresa){
$currentDate = false;
while($resaList = $listresa->fetch(PDO::FETCH_ASSOC)) { ?>
<?php if ($resaList['alveole'] == 2) {
$i++;
if ($resaList['dateresa'] != $currentDate) {
?>
<tr class="" >
<td class="dropdown-toggle" colspan='1' data-toggle="collapse" data-target="#collapseDate1" aria-expanded="false" aria-controls="collapseDate"><?php echo $resaList['dateresa']; ?></td>
</tr>
<?php $currentDate = $resaList['dateresa'];
}
?>
<tr class="collapse" id="collapseDate1">
<?php
$nbdate = $resaList['dateresa'];
$nbalv = 2;
$compte = $bdd->query("SELECT dateresa, alveole,
sum(CASE WHEN AM is not null THEN 1 else 0 end) am_count,
sum(CASE WHEN PM is not null THEN 1 else 0 end) pm_count
FROM reservation
WHERE dateresa='$nbdate'
AND alveole='$nbalv'
group by dateresa, alveole
order by dateresa, alveole");
$compteresa = $compte->fetchColumn();
if ($compteresa['am_count'] == 'on') {?>
<?php if ($compteresa == 1) {?>
<td><?php echo $compteresa ," place réservée pour 09h-12h"; ?></td>
<?php }else{ ?>
<td><?php echo $compteresa ," places réservées pour 09h-12h"; ?></td>
<?php }} else{
if ($compteresa['pm_count'] == 'on') {?>
<?php if ($compteresa == 1) {?>
<td><?php echo $compteresa ," place réservée pour 14h-17h"; ?></td><br>
<?php }else{ ?>
<td><?php echo $compteresa ," places réservées pour 14h-17h"; ?></td>
<?php }}
}
} } };?>
</tbody>
Oui effectivement c'est mieux avec fetch tout court, et effectivement c'est un tableau, par conte il y a un souci car dans la bdd jai 3 lignes dont 2 avec 'PM' et une avec 'AM' alors que le print_r trouve 3 lignes pour chaque, il ne fait pas la différence entre les 2, AM et PM il fait la somme totale des 2 non?
Ce que je comprend pas c'est le "is not null THEN 1 else 0 end" si tu peux m'expliquer stp. (Si pas null puis 1 sinon 0 fin ) le 1 c'est un booléen genre true false ou c'est la valeurs un? du coup je vois pas comment est geré ou interpreté le 'on'!
Si tu peux m'éclairer ca serait cool.
La db:
id prenom nom alveole ftype datecreation AM PM statut dateresa iduser
|92|test1|test1 |2| 1|2020-05-31 21:01:29| 0|on|nonconfirme|06/06/2020|1
|91|test2|test2 |2| 1|2020-05-31 21:01:08| 0|on|nonconfirme|06/06/2020|1
|94|test3|test3 |2| 1|2020-05-31 23:34:40| on|0|nonconfirme|06/06/2020|1
Voici le Print_R
Array
(
[dateresa] => 06/06/2020
[0] => 06/06/2020
[alveole] => 2
[1] => 2
[am_count] => 3
[2] => 3
[pm_count] => 3
[3] => 3
)
Voici le resultat des echo avec cconditions ce qui est cohérent avec le print_r, mais c'est pas ce que je souhaite.
06/06/2020
3 places réservées pour 09h-12h
3 places réservées pour 14h-17h
Voici le code
<?php
$nbdate = $resaList['dateresa'];
$nbalv = 2;
$compte = $bdd->query("SELECT dateresa, alveole,
sum(CASE WHEN AM is not null THEN 1 else 0 end) am_count,
sum(CASE WHEN PM is not null THEN 1 else 0 end) pm_count
FROM reservation
WHERE dateresa='$nbdate'
AND alveole='$nbalv'
group by dateresa, alveole
order by dateresa, alveole");
$compteresa = $compte->fetch();
echo "<pre>";
print_r($compteresa) ;
echo "</pre>";
if ($compteresa['am_count'] == 1) {?>
<td><?php echo $compteresa['am_count'] ," place réservée pour 09h-12h"; ?></td>
<?php }else{ ?>
<td><?php echo $compteresa['am_count'] ," places réservées pour 09h-12h"; ?></td>
<?php }?>
<?php if ($compteresa['pm_count'] == 1) {?>
<td><?php echo $compteresa['pm_count'] ," place réservée pour 14h-17h"; ?></td><br>
<?php }else{ ?>
<td><?php echo $compteresa['pm_count'] ," places réservées pour 14h-17h"; ?></td>
<?php }
} } } ;?>