Problème affichage foreach

Par regisDevweb, il y a 9 ans


Bonjour,
j'intervient sur un forum car j'ai un petit soucis d'affichage, enfaite mon foreach pour afficher mes reservation ne m'affiche q'un resultat au lieux de deux alors que il devrait en afficher deux par exemple :

| idReservation | date_heure_Reservation | nbPersonnes | statut | idResto | idClient |
+---------------+------------------------+-------------+------------+---------+----------+
| 1 | 2017-02-15 03:06:45 | 3 | En attente | 1 | 6 |
| 2 | 2017-02-23 12:14:02 | 3 | validé | 3 | 6

la mon client à effectuer deux reservation mais il n'est afficher que la première réservation et non la deuxième et je voudrais qu'est ce qui cloche dans mon code

Ce que je fais

Code : Vue mesReservations.php

if(is_array($unResultat)) { foreach (array($unResultat) as $maReservation) { echo" <table class=table> <thead> <tr class=success> <th> date et heure de la reservation : </th> <th> Nombre de Personnes : </th> <th> statut de la reservation : </th> </tr> </thead> <tbody> <tr> <td> ".$maReservation['date_heure_Reservation']." </td> <td> ".$maReservation['nbPersonnes']." </td> <td> ".$maReservation['statut']." </td> </tr> </tbody> </table> "; } }

Code : mesReservation.php

<?php include("MVC_PHP/Controleur/Controleur_site.php"); $Controleur = new affichageResto("localhost", "restline", "root", ""); $where = array( "idClient" => $_SESSION['idClient'] ); $champs = array("date_heure_Reservation", "nbPersonnes", "statut"); $unResultat = $Controleur-> AffichageMaReservation($champs, $where); include("MVC_PHP/Vues/Vues_mesReservation.php"); ?>

code var_dump de l'affichage

C:\wamp64\www\Projet_php\Resline_site\MVC_PHP\Modele\Modele_site.php:60: object(PDOStatement)[4] public 'queryString' => string 'select date_heure_Reservation,nbPersonnes,statut from reservation where idClient= :idClient;' (length=95) C:\wamp64\www\Projet_php\Resline_site\MVC_PHP\Modele\Modele_site.php:62: array (size=6) 'date_heure_Reservation' => string '2017-03-12 12:13:28' (length=19) 0 => string '2017-03-12 12:13:28' (length=19) 'nbPersonnes' => string '2' (length=1) 1 => string '2' (length=1) 'statut' => string 'En attente' (length=10) 2 => string 'En attente' (length=10)

Ce que je veux

que deux resultats s'affiche correpondant à l'id du client donc;
date et heure de la reservation : Nombre de Personnes : statut de la reservation :
2017-02-15 03:06:45 3 En attente
2017-02-23 12:14:02 3 Validé

Ce que j'obtiens

juste 1 resultat qui est :

date et heure de la reservation : Nombre de Personnes : statut de la reservation :
2017-02-15 03:06:45 3 En attente

7 réponses

Carouge10, il y a 9 ans

Bonjour,
Apparemment dans ton Model_side, tu ne renvoies qu'un enregistrement.
Peux-t-on avoir le code de celui-ci.

D'autre part, il est inutile de dire que $unResultat est un array dans ton foreach

foreach ($unResultat as $maReservation)

De plus la variable "querystring" qui corresponds à ta requête SQL est bonne, en revanche elle juste mal écrite ce qui rends sa lecture un peu plus dure. C'est à dire qu'en générale les valeurs obligatoires sont écrites en majuscules, comme SELECT, FROM et WHERE. Ce qui permet une lecture plus simple.

regisDevweb, il y a 9 ans

ok, mais theoriquement si tu fait un select ..... from ... where id = 6 par exemple ca te retournera plusieurs lignes si bien sur il y a deux clé etrangere ou plus qui sont égales à 6?

et le code :

public function selectWhere($champs, $where) //Modele select { $chaineChamps = implode(",", $champs); //rassemble les donnees $clause = array(); //pour les order by etc $donnees = array(); //pour les valeurs dans la bdd foreach ($where as $cle => $valeur) { # code... $clause[] = $cle."= :".$cle; //selection des clauses(where, order by etc....) $donnees[":".$cle] = $valeur;//$cle = :nom par exempleS } $chaineclause = implode(" and ", $clause); $requete = "select ".$chaineChamps." from ".$this->table." where ".$chaineclause.";"; $select = $this ->pdo->prepare($requete); $select ->execute($donnees); $unResultat = $select->fetch();
regisDevweb, il y a 9 ans

j'ai trouvé la solution c'est fetchAll à la place de fecth ^^

Carouge10, il y a 9 ans

Oui voilà, tu peux demander seulement de retourner un seul enregistrement.
Le fetchAll corrige ton problème.

Par contre tu peux définir le format de retour (Tableau, objet...) pour ne pas avoir les données en double.

regisDevweb, il y a 9 ans

c'est à dire? un select distinct?

Carouge10, il y a 9 ans

Fetch retourne une ligne des résultats obtenus
Un FetchAll, retourne tous les enregistrements d'un coup.

Fetch avec les paramètres à lui passer pour que les resultats soit au choix, un tableau associés, un tableau indexés, un objet...

regisDevweb, il y a 9 ans

ok je voie merci