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


regisDevweb
Auteur
Réponse acceptée

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

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.

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();

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.

c'est à dire? un select distinct?

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...

ok je voie merci