Bonjour,
j'ai u problème sur mes vérification de champ obligatoire, même si je met des valeurs ça me met qu'il sont obligatoire alors que ça devrait insérer les valeurs, j'ai regarder sur plusieurs forum et testé de différente manière mais rien ne marche

Ce que je fais

que le message champ obligatoire n'apparaise plus si il y a des valeurs dans les inputs

if(isset($_POST['erg']))
  {
      $date = $_POST['dr'];
      $dateEn = $Controleur-> retournerdateEn($date);

      if(strlen($date) == 0)
      {
         $tableau['dr'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  date obligatoire </p>
              </div>";
      }

      $nbPersonne = $_POST['nbpers'];

      if(strlen($nbPersonne) == 0)
      {
        $tableau['nbpers'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  nombre de personne obligatoire </p>
              </div>";
      }
      else if(!is_numeric($nbPersonne))
      {
        $tableau['nbpers'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  Nb de personne pas au bon format </p>
              </div>";
      }

      $idResto = $_POST['idR'];

      if(count($tableau) == 0)
      {

        $tab = array(
        "date_heure_Reservation" => $dateEn,
        "nbPersonnes" => $nbPersonne,
        "statut" => "En attente",
        "idResto" => $idResto,
        "idClient" => $_SESSION['idClient']
      );

      $Controleur-> insertionReservation($tab);
      echo "<br />
              <div class='alert alert-success'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'> Réservation Éffectué </p>
              </div>";
      }

     if (count($tableau) > 0)
      {
        foreach ($tableau as $champEnErreur => $erreursDuChamp) {
          foreach ($erreursDuChamp as $erreur) {
              echo $erreur;
          }
      }

    }

  }

Ce que je veux

que l'insertion se fasse si il y a des valeurs dans les inputs

Ce que j'obtiens

date obligatoire

nombre de personne obligatoire

23 réponses


saibe
Réponse acceptée

;) ça avance... mais ce que je t'avais dit ct de choisir l'un ou l'autre (le form englobant ou les name array ;) ) en fonction de tes besoins...
en faisant les 2 tu récupères un array... donc tes $valeur sont des array...
enlève les crochets des names de ton formulaire, par ex : name='nbpers[]' en name='nbpers'
et enfin tu as encore un id à modifier : id='rbt' en id='submit_".$Reservation['idResto']."' par exemple...

Bonjour,
Je pense que ton problème viens de strlen. Il faut faire la différence entre vide et rien.
Essaye plutôt avec ceci :

// Si date est vide alors
if(empty($date))
      {
         $tableau['dr'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class='close' data-dismiss='alert'>&times;</a>
                <p style='text-align: center;'>  date obligatoire </p>
              </div>";
      }

Toujour les même messages

 if(isset($_POST['erg']))
  {
      $date = $_POST['dr'];
      $dateEn = $Controleur-> retournerdateEn($date);

      if(empty($date))
      {
         $tableau['dr'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  date obligatoire </p>
              </div>";
      }

      $nbPersonne = $_POST['nbpers'];

      if(empty($nbPersonne))
      {
        $tableau['nbpers'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  nombre de personne obligatoire </p>
              </div>";
      }
      else if(!is_numeric($nbPersonne))
      {
        $tableau['nbpers'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  Nb de personne pas au bon format </p>
              </div>";
      }

      $idResto = $_POST['idR'];

      if(count($tableau) == 0)
      {

        $tab = array(
        "date_heure_Reservation" => $dateEn,
        "nbPersonnes" => $nbPersonne,
        "statut" => "En attente",
        "idResto" => $idResto,
        "idClient" => $_SESSION['idClient']
      );

      $Controleur-> insertionReservation($tab);
      echo "<br />
              <div class='alert alert-success'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'> Réservation Éffectué </p>
              </div>";
      }

     if (count($tableau) > 0)
      {
        foreach ($tableau as $champEnErreur => $erreursDuChamp) {
          foreach ($erreursDuChamp as $erreur) {
              echo $erreur;
          }
      }

    }

  }

Que t'affiche un "var_dump($date);" avant le if ?
Pourrais-je avoir le formulaire (ou au moins une partie suivant la taille) ?

var_dum($date);
C:\wamp64\www\Projet_php\Resline_site\Formulaire_Reserver.php:54:string '' (length=0)

formulaire

 echo"
  <form method=post action='Formulaire_Reserver.php'>
  <div class='table-responsive'>
  <div class='col-lg-12' >
  <table class='table table-bordered table-strip'>
    <thead>
      <tr class=success>
        <th> Nom du restaurant  </th>
        <th> Nombre de table disponible  </th>
        <th> Telephone  </th>
        <th> Heure d'ouverture  </th>
        <th> Heure de fermeture  </th>
        <th> Date de la Reservation  </th>
        <th> Nombre de personne</th>
        <th> Réserver  </th>

      </tr>
    </thead>
    <tbody>";

    foreach ($resultats as $Reservation)
    {
      echo"<tr style='text-align: center;'>
        <td> ".$Reservation['nomResto']." </td>
        <td> ".$Reservation['nbTables']." </td>
        <td> ".$Reservation['telResto']." </td>
        <td> ".$Reservation['heureOuv']." </td>
        <td>".$Reservation['heureFer']." </td>
        <td><input type=date style='cursor: pointer' onclick='new calendar(this);' id='input1' placeholder='Date de la reservation' name=dr /></td>
        <td><input type=text name=nbpers placeholder='Nombre de personne' /></td>
        <td><input type=hidden name=idR value=". $Reservation['idResto'] ." /><button type=submit name=erg class='btn btn-success btn-sm btn-blockname' id=rbt><span class='glyphicon glyphicon-calendar'></span> Enregistrer Reservation </button></td>
      </tr>";
    }

    echo"</tbody>
    </table>
    </div>
    </div>
    </form>";

Perso, je ne suis pas fan de mettre beaucoup de html dans un echo.

<form method='post' action='Formulaire_Reserver.php'>
  <div class='table-responsive'>
  <div class='col-lg-12' >
  <table class='table table-bordered table-strip'>
    <thead>
      <tr class=success>
        <th> Nom du restaurant  </th>
        <th> Nombre de table disponible  </th>
        <th> Telephone  </th>
        <th> Heure d'ouverture  </th>
        <th> Heure de fermeture  </th>
        <th> Date de la Reservation  </th>
        <th> Nombre de personne</th>
        <th> Réserver  </th>

      </tr>
    </thead>
    <tbody>

    <php foreach ($resultats as $Reservation): ?>
        <tr style='text-align: center;'>
        <td><?= $Reservation['nomResto']; ?></td>
        <td><?= $Reservation['nbTables']; ?></td>
        <td><?= $Reservation['telResto']; ?></td>
        <td><?= $Reservation['heureOuv']; ?></td>
        <td><?= $Reservation['heureFer']; ?></td>
        <td><input type='date' style='cursor: pointer' onclick='new calendar(this);' id='input1' placeholder='Date de la reservation' name='dr' /></td>
        <td><input type='text' name='nbpers' placeholder='Nombre de personne' /></td>
        <td><input type='hidden' name='idR' value="<?= $Reservation['idResto']; ?>" /><button type='submit' name='erg' class='btn btn-success btn-sm btn-blockname' id='rbt'><span class='glyphicon glyphicon-calendar'></span> Enregistrer Reservation </button></td>
      </tr>
      <php endforeach; ?>

    </tbody>
    </table>
    </div>
    </div>
    </form>

Par contre tu utlises un foreach pour lister des différents restaurants en revanche, tout tes inputs pour la date porte le même nom quelque soit le restaurant. Donc le $_POST['dr'] récupère la date du dernier input du dernier restaurant.

ok mais enfaite je suis obligé de les mettres en balise php car je les include après sur formulaire_réservation.php

<?php
  include("MVC_PHP/Controleur/Controleur_site.php");
  $Controleur = new affichageResto("localhost", "restline", "root", "");

  $resultats = $Controleur-> affichageReservation();
  include("MVC_PHP/Vues/Vues_formulaire_reservation.php");
  $tableau = array();

  if(isset($_POST['erg']))
  {
      $date = $_POST['dr'];
      $dateEn = $Controleur-> retournerdateEn($date);

      var_dumP($date);
      if(empty($date))
      {
         $tableau['dr'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  date obligatoire </p>
              </div>";
      }

      $nbPersonne = $_POST['nbpers'];

      if(empty($nbPersonne))
      {
        $tableau['nbpers'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  nombre de personne obligatoire </p>
              </div>";
      }
      else if(!is_numeric($nbPersonne))
      {
        $tableau['nbpers'][] = "
              <div class='alert alert-warning'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'>  Nb de personne pas au bon format </p>
              </div>";
      }

      $idResto = $_POST['idR'];

      if(count($tableau) == 0)
      {

        $tab = array(
        "date_heure_Reservation" => $dateEn,
        "nbPersonnes" => $nbPersonne,
        "statut" => "En attente",
        "idResto" => $idResto,
        "idClient" => $_SESSION['idClient']
      );

      $Controleur-> insertionReservation($tab);
      echo "<br />
              <div class='alert alert-success'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'> Réservation Éffectué </p>
              </div>";
      }

     if (count($tableau) > 0)
      {
        foreach ($tableau as $champEnErreur => $erreursDuChamp) {
          foreach ($erreursDuChamp as $erreur) {
              echo $erreur;
          }
      }

    }

  }

?>

d'accord, cela ne résoud pas le problème que je t'ai dis en fin de mon précédent post

c'était juste pour te montrer ou était l'include mais je cherche une solution

il faut pour chaque input un nom différent, tu peux te servir pour cela de l'id du restaurant

si je comprend bine sur mes inputs je met
value=". $Reservation['idResto'] c'est sa?

euh name"nbpers. $Reservation['idResto']." plutot non?

Bonjour.
En plus de ce qu'a dit Carouge10, si tu ne définis pas la valeur de l'input pour la date, tu te retrouveras toujours avec une valeur vide pour ce champ, tout du moins tant que l'utilisateur ne le redéfinis pas manuellement.
Sans compter que sur ce même input, tu sembles utiliser du javascript dessus, sauf que si tu définis la même valeur pour l'attribut id à plusieur éléments du DOM, tu vas avoir des problèmes du côté de javascript.
Pour rappel, la valeur d'un attribut id dans le DOM doit être unique pour le javascript.

ok je voie se que tu veut dire Lartak mais je ne voie toujours pas commement faire enfin je cherche

ce que à proposer juste avant est très bien.
Fais de même pour le js.

Après pour le traitement, il va falloir revoir le déroulement car il faut traiter les champs vide uniquement du restaurant où l'on souhaite réserver.

avec des chekbox est ce que sa serais mieux?

oui pourquoi pas et ensuite dans le traitement, tu test si c'est coché.

je pensait plus à faire un truc de ce genre

<td><input type='checkbox' name=rest values=". $Reservation['idResto'] ." /></td>

et

champ vide

if(empty($date) && $_POST['rest'] = "")
if(empty($nbPersonne) && $_POST['rest'] = "")

si aucune erreur et checkbox sélectionné

if(count($tableau) == 0 && isset($_POST['rest']))

mais ça ne marche pas ^^", est ce que c'est la bonne écriture?

Pour comparer, il faut le double =.
De plus ce n'est la bonne méthode pour les tests sur checbox...
La doc

ok j'ai vue ta doc et tant pis je le ferais en js par contre j'ai un autre soucis d'insertion que je n'arrive pas à résoudre dans mon foreach qui est que quand je submit mes champs il n'insere plus dans la base
voici mon code

ma vue

    foreach ($resultats as $Reservation)
    {
      echo"<tr style='text-align: center;'>
        <td> ".$Reservation['nomResto']." </td>
        <td> ".$Reservation['nbTables']." </td>
        <td> ".$Reservation['telResto']." </td>
        <td> ".$Reservation['heureOuv']." </td>
        <td>".$Reservation['heureFer']." </td>
        <td><input type=date style='cursor: pointer' onclick='new calendar(this);' id='input1' placeholder='Date de la reservation' name=dr /></td>
        <td><input type=text name=nbpers placeholder='Nombre de personne' /></td>
        <td><input type=hidden name=idR value=". $Reservation['idResto'] ." /><button type=submit name=erg class='btn btn-success btn-sm btn-blockname' id=rbt><span class='glyphicon glyphicon-calendar'></span> Enregistrer Reservation </button></td>
      </tr>";

   }

mon formulaire de reservation

<?php
  include("MVC_PHP/Controleur/Controleur_site.php");
  $Controleur = new affichageResto("localhost", "restline", "root", "");

  $resultats = $Controleur-> affichageReservation();
  include("MVC_PHP/Vues/Vues_formulaire_reservation.php");

  if(isset($_POST['erg']))
  {
      $date = $_POST['dr'];
      $dateEn = $Controleur-> retournerdateEn($date);
      $nbPersonne = $_POST['nbpers'];
      $idResto = $_POST['idR'];

        $tab = array(
        "date_heure_Reservation" => $dateEn,
        "nbPersonnes" => $nbPersonne,
        "statut" => "En attente",
        "idResto" => $idResto,
        "idClient" => $_SESSION['idClient']
      );

      $Controleur-> insertionReservation($tab);
      echo "<br />
              <div class='alert alert-success'>
                <a href='Formulaire_Reserver.php' class=close data-dismiss=alert>&times;</a>
                <p style='text-align: center;'> Réservation Éffectué </p>
              </div>";

  }

?>

Hello, ça ne peut pas fonctionner, car comme te l'ont dit et redit @Carouge10 et @Lartak si ton $resultats = $Controleur-> affichageReservation(); te renvoie plusieurs résultats tu vas boucler et définir les mêmes id et mêmes name pour tes inputs ; du coup ton fichier de traitement 'Formulaire_Reserver.php' ne récupérera que les dernières infos....

  • si tu ne veux réserver que pour un seul resto, tu peux englober chaque tr avec ton form
  • ou si tu veux faire plusieurs réservations tu name tes inputs en array, comme ça name='dr[]'et tu fais un ti traitement

et surtout, tu rename tes id pour qu'ils soient uniques, ainsi id='input". $Reservation['idResto'] ."'

ok saibe merci il recupere bien les infos ce qui donne :

    foreach ($resultats as $Reservation)
    {
      echo"<form method=post action='Formulaire_Reserver.php'>
      <tr style='text-align: center;'>
        <td> ".$Reservation['nomResto']." </td>
        <td> ".$Reservation['nbTables']." </td>
        <td> ".$Reservation['telResto']." </td>
        <td> ".$Reservation['heureOuv']." </td>
        <td>".$Reservation['heureFer']." </td>
        <td><input type=date style='cursor: pointer' onclick='new calendar(this);'placeholder='Date de la reservation' name='dr[]' id='input".$Reservation['idResto']."'/>
        </td>
        <td><input type=number placeholder='Nombre de personne' name='nbpers[]'  id='input1".$Reservation['idResto']."'/></td>
        <td><input type='hidden' id='input3".$Reservation['idResto']."' name='idR[]' value='".$Reservation['idResto']."'/><button type=submit name='erg' class='btn btn-success btn-sm btn-blockname' id='rbt' ><span class='glyphicon glyphicon-calendar'></span> Enregistrer Reservation 
        </button></td>
      </tr>
      </form>";

   }

par contre j'ai une erreur ou il met dit

Notice: Array to string conversion in C:\wamp64\www\Projet_php\Resline_site\MVC_PHP\Modele\Modele_site.php on line 91 donc au niveau de     $insert->execute($donnees);

voici ma methode insert

public function insert($tab) //méthode pour inserer dans la base
  {
    $champs = array();
    $donnees = array();
    $valeurs = array();

    foreach ($tab as $cle => $valeur) {
      $champs[] = $cle;
      $valeurs[]= ":".$cle; //valeur = apres value
      $donnees[":".$cle] = $valeur;
    }

    $listechamps = implode(",", $champs);
    $chaineChamps = implode(",", $valeurs);

    $requete = "insert into ".$this->table."(".$listechamps.") values(".$chaineChamps.");";
    var_dump($donnees);
    $insert = $this->pdo->prepare($requete);
    $insert->execute($donnees);

  }

il me dit qu'il peut le convertir en string mais il me manque quoi?

ça marche!!!! merçis lartak, Carouge10 et saibe, désolé de vous avoir dérangé, il faut que je fasse des progès pour ça ^^"