Vérification avant insertion php - Mysql

Résolu

Bonjour,

j'ai le code ci-dessous qui me pemet de créer une quittance pour un locataire.

        <?php

        if(session_status() == PHP_SESSION_NONE){
            session_start();
        }
        

        /*Avant l'insertion de la quittance, vérifier si la quittance n'est pas déjà ouverte pour ce 
          locataire pour le mois courant.
        */

        //---------------------------------------------------------------//
        //connexion à la bdd
        // A lire et à appliquer avant de poursuivre :
        // http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
        //---------------------------------------------------------------//
            require_once('../inc/connexion.php');

            /**
            * Fonction pour créer une quittance
            */

        
            function creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice ){
            $db = getDB();
            $id = $_SESSION['auth']->id; 
            $stmt = $db->query("  SELECT next_new_invoice  FROM users WHERE   ".$_SESSION['auth']->id." = id", PDO::PARAM_STR);
            $stmt->bindValue("id", $id, PDO::PARAM_INT);
            $donnees = $stmt->fetch();

            //echo $donnees['next_new_invoice'];
            $id_invoice = $donnees['next_new_invoice'];
            //$id_invoice++;
   

            //echo $id_invoice;
            $id_invoice++; echo '<br>';  
            echo $id_invoice;

            $receipt=$id_invoice;
            $stmt = $db->prepare("INSERT INTO receipt (receipt, id_customers,  room_number)  VALUES(:receipt, :id_customers,  :room_number)");
            $stmt->bindParam("id_customers", $id_customers,PDO::PARAM_INT);
            $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
            $stmt->bindParam("room_number", $room_number,PDO::PARAM_INT);
           // $stmt->execute();

            $receipt=$id_invoice;
            $stmt = $db->prepare("INSERT INTO state (id_state, receipt, creation_date, month, year) VALUES(:id_state,  :receipt , :creation_date, :month, :year )");
            $stmt->bindParam("id_state", $id_state,PDO::PARAM_INT);
            $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
            $stmt->bindParam(':creation_date', $creation_date,PDO::PARAM_STR);
            $stmt->bindParam(':month', $month,PDO::PARAM_STR);
            $stmt->bindParam(':year', $year,PDO::PARAM_STR);
          //  $stmt->execute();


            //mise à jour du prochain numéro de quittance
            $next_new_invoice=$id_invoice;
            //echo  $next_new_invoice;
            $stmt = $db->prepare("UPDATE users SET  next_new_invoice='$next_new_invoice'  WHERE ".$_SESSION['auth']->id." = id" );
            $stmt->bindParam('next_new_invoice', $_GET['next_new_invoice'], PDO::PARAM_INT);
            $stmt->bindValue("id", $id, PDO::PARAM_INT);
           // $stmt->execute();

            }

         

          //---------------------------------------------------//
        // On récupère proprement les variables envoyées 
        // en $_POST  AVANT de les utiliser
        // pour cela, j'utilise l'écriture ternaire : https://blog.smarchal.com/operateur-ternaire-php#:~:text=L'op%C3%A9rateur%20ternaire%20est%20un,%5BTHEN%5D%20%3A%20%5BELSE%5D%3B
        //---------------------------------------------------//

        $receipt = !empty($_POST["receipt"]) ? $_POST["receipt"] : NULL;
        $id_customers = !empty($_POST["id_customers"]) ? $_POST["id_customers"] : NULL;
        $room_number = !empty($_POST["room_number"]) ? $_POST["room_number"] : NULL;
        $id_state = !empty($_POST["id_state"]) ? $_POST["id_state"] : NULL;
        $creation_date = !empty($_POST["creation_date"]) ? $_POST["creation_date"] : NULL;
        $month = !empty($_POST["month"]) ? $_POST["month"] : NULL;
        $year = !empty($_POST["year"]) ? $_POST["year"] : NULL;

        $next_new_invoice = !empty($_POST["next_new_invoice"]) ? $_POST["next_new_invoice"] : NULL;

        $createReceipt = isset($_POST["createReceipt"]) ? $_POST["createReceipt"] : NULL;






        //---------------------------------------------------//
        // Traitement du formulaire
        //---------------------------------------------------//
        if(!empty($_POST)) {

        $errors =array();



           // Si il n'y a pas d'erreurs ...
         if(empty($errors)) {


         if(isset($createReceipt)){ 
             //On crée la quittance si toutes les conditions sont réunies
            creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice );  
           // header('Location: ../array/receipts.php');
         //  echo "<script type='text/javascript'>document.location.replace('../array/receipts.php');</script>";
             exit; //toujours mettre un exit après une redirection
        } 


}
}

Je voudrais vérifier si une quittance est déja ouverte pour ce locataire, pour le mois en cours, je sais pas comment m'y prendre.

Pour ça il me faut déjà les informations mois, id_customers et numéro de chambre ?

J'ai la requête ci-dessous qui m'affiche toutes les informations que j'ai besoin quand la quittance est créer. Sauf que la requête ci-dessous m'affiche les informations par rapport au numéro de la quittance, comme elle est pas encore créer ça ne fonctionne pas pour ce que je veux. 

 $receipt = $_GET['receipt'];
 $db = getDB();
 $stmt = $db->query("  SELECT * from receipt 

  LEFT JOIN customers ON (receipt.id_customers=customers.id_customers)
  LEFT JOIN rooms ON (receipt.room_number=rooms.room_number)         
  LEFT JOIN state ON (receipt.receipt=state.receipt)         

  WHERE receipt.receipt=$receipt ");

 $donnees = $stmt->fetch();

J'ai bricoler pas mal de chose, mais je sais pas comment m'y prendre.
Windows / Chrome 107.0.0.0

6 réponses

  1. Modérateur

    Bonjour

    Ta question concerne davantage les requêtes SQL...

    Et pour pouvoir te répondre il faudrait un minima nous montrer la structure de tes tables voire même nous fournir quelques exemples de données qui s'y trouvent.


    1. La table state :

      id_state 

      receipt (num de quittance)

      state    (1 ou 2) quand la quittance est à '0' le statut se change, et la quittance va sur la page des quittance acquittées

      month  (mois en cours)

      year    

      La table receipt :

      id_receipt

      receipt  (num de quittance)

      id_customers (id qui provient de la table customers)

      room_number (id qui provient de la table rooms)

      La table customers :

      id_customers

      prenom (+ infos du client)

      La table rooms :

      id_rooms

      id_customers

      room_number (+ infos de la chambre, surface, prix etc...)

      1. Modérateur

        Tu n'as pas donné d'exemple de données... donc je ne peux qu'imaginer le fonctionnement

        Donc..

        Avec une requête de ce genre, tu pourras vérifier si une quittance existe en fonction des paramètres voulus (mois, id_customers et numéro de chambre )

        SELECT *
        FROM  `state` S
        LEFT JOIN receipt R ON R.receipt  = S.receipt 
        WHERE id_customers = '$id_customers'
         AND  room_number  = '$roomNumber'
         AND S.month = '$mois'
         

        1.  J'ai les  messages d'erreur ci-dessous :

          ( ! ) Notice: Undefined variable: roomNumber in C:\wamp64\www\24\app\process\receipts.php on line 110
          
           Notice: Undefined variable: mois in C:\wamp64\www\24\app\process\receipts.php on line 110
          ( ! ) Notice: Undefined variable: roomNumber in C:\wamp64\www\24\app\process\receipts.php on line 115
          
          Notice: Undefined variable: mois in C:\wamp64\www\24\app\process\receipts.php on line 116
                  <?php
          
                  if(session_status() == PHP_SESSION_NONE){
                      session_start();
                  }
                  
          
                  /*Avant l'insertion de la quittance, vérifier si la quittance n'est pas déjà ouverte pour ce 
                    locataire pour le mois courant.
                  */
          
                  //---------------------------------------------------------------//
                  //connexion à la bdd
                  // A lire et à appliquer avant de poursuivre :
                  // http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
                  //---------------------------------------------------------------//
                      require_once('../inc/connexion.php');
          
                      /**
                      * Fonction pour créer une quittance
                      */
          
                  
                      function creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice ){
                      $db = getDB();
                      $id = $_SESSION['auth']->id; 
                      $stmt = $db->query("  SELECT next_new_invoice  FROM users WHERE   ".$_SESSION['auth']->id." = id", PDO::PARAM_STR);
                      $stmt->bindValue("id", $id, PDO::PARAM_INT);
                      $donnees = $stmt->fetch();
          
                      //echo $donnees['next_new_invoice'];
                      $id_invoice = $donnees['next_new_invoice'];
                      //$id_invoice++;
             
          
                      //echo $id_invoice;
                      $id_invoice++; echo '<br>';  
                     // echo $id_invoice;
          
                      $receipt=$id_invoice;
                      $stmt = $db->prepare("INSERT INTO receipt (receipt, id_customers,  room_number)  VALUES(:receipt, :id_customers,  :room_number)");
                      $stmt->bindParam("id_customers", $id_customers,PDO::PARAM_INT);
                      $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                      $stmt->bindParam("room_number", $room_number,PDO::PARAM_INT);
                      $stmt->execute();
          
                      $receipt=$id_invoice;
                      $stmt = $db->prepare("INSERT INTO state (id_state, receipt, creation_date, month, year) VALUES(:id_state,  :receipt , :creation_date, :month, :year )");
                      $stmt->bindParam("id_state", $id_state,PDO::PARAM_INT);
                      $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                      $stmt->bindParam(':creation_date', $creation_date,PDO::PARAM_STR);
                      $stmt->bindParam(':month', $month,PDO::PARAM_STR);
                      $stmt->bindParam(':year', $year,PDO::PARAM_STR);
                      $stmt->execute();
          
          
                      //mise à jour du prochain numéro de quittance
                      $next_new_invoice=$id_invoice;
                      //echo  $next_new_invoice;
                      $stmt = $db->prepare("UPDATE users SET  next_new_invoice='$next_new_invoice'  WHERE ".$_SESSION['auth']->id." = id" );
                      $stmt->bindParam('next_new_invoice', $_GET['next_new_invoice'], PDO::PARAM_INT);
                      $stmt->bindValue("id", $id, PDO::PARAM_INT);
                      $stmt->execute();
          
                      }
          
                   
          
                    //---------------------------------------------------//
                  // On récupère proprement les variables envoyées 
                  // en $_POST  AVANT de les utiliser
                  // pour cela, j'utilise l'écriture ternaire : https://blog.smarchal.com/operateur-ternaire-php#:~:text=L'op%C3%A9rateur%20ternaire%20est%20un,%5BTHEN%5D%20%3A%20%5BELSE%5D%3B
                  //---------------------------------------------------//
          
                  $receipt = !empty($_POST["receipt"]) ? $_POST["receipt"] : NULL;
                  $id_customers = !empty($_POST["id_customers"]) ? $_POST["id_customers"] : NULL;
                  $room_number = !empty($_POST["room_number"]) ? $_POST["room_number"] : NULL;
                  $id_state = !empty($_POST["id_state"]) ? $_POST["id_state"] : NULL;
                  $creation_date = !empty($_POST["creation_date"]) ? $_POST["creation_date"] : NULL;
                  $month = !empty($_POST["month"]) ? $_POST["month"] : NULL;
                  $year = !empty($_POST["year"]) ? $_POST["year"] : NULL;
          
                  $next_new_invoice = !empty($_POST["next_new_invoice"]) ? $_POST["next_new_invoice"] : NULL;
          
                  $createReceipt = isset($_POST["createReceipt"]) ? $_POST["createReceipt"] : NULL;
          
          
          
          
          
          
                  //---------------------------------------------------//
                  // Traitement du formulaire
                  //---------------------------------------------------//
                  if(!empty($_POST)) {
          
                  $errors =array();
          
          
          
                
          
          
          
          
          
          
                    $db = getDB();
                    $stmt = $db->query("SELECT * FROM  `state` S LEFT JOIN receipt R ON R.receipt  = S.receipt WHERE id_customers = '$id_customers'
                    AND  room_number  = '$roomNumber' AND S.month = '$mois' ");
                    $donnees = $stmt->fetch();
          
          
                     echo  $id_customers ; echo '<br';
                     echo  $roomNumber ;  echo '<br';
                     echo $mois ;
          
          
                        
          
            
          
                     // Si il n'y a pas d'erreurs ...
                   if(empty($errors)) {
          
          
                   if(isset($createReceipt)){ 
                       //On crée la quittance si toutes les conditions sont réunies
                      creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice );  
                     // header('Location: ../array/receipts.php');
                   //  echo "<script type='text/javascript'>document.location.replace('../array/receipts.php');</script>";
                       exit; //toujours mettre un exit après une redirection
                  } 
          
          
          }
          }
        2. J'ai bricoler ce code j'ai ajouter le code de la ligne 28 à 54, ça fonctionne, sauf que 'ai pas le message qui dit que la quiitance pour ce loctaire pour ce mois-ci est déja ouverte. (je l'ai seulement quand je désactive la redirection), avec la redirection il ne la crée pas mais il n'y à pas de message d'erreur.

                  <?php
          
                  if(session_status() == PHP_SESSION_NONE){
                      session_start();
                  }
                  
          
                  /*Avant l'insertion de la quittance, vérifier si la quittance n'est pas déjà ouverte pour ce 
                    locataire pour le mois courant.
                  */
          
                  //---------------------------------------------------------------//
                  //connexion à la bdd
                  // A lire et à appliquer avant de poursuivre :
                  // http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
                  //---------------------------------------------------------------//
                    require_once('../inc/connexion.php');
          
                      /**
                      * Fonction pour créer une quittance
                      */
          
          
                      function creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice ){
          
          
                          $db = getDB();
                          $stmt = $db->query("  SELECT receipt.id_customers, showin, month from receipt LEFT JOIN customers ON (receipt.id_customers=customers.id_customers)
          
                          WHERE receipt.id_customers = '$id_customers' AND month=$month");
          
                          $donnees = $stmt->fetch();
          
                          $today = date("m");  
          
                          echo $today; echo '<br>';
          
          
          
                            if (isset($donnees['id_customers']) == $id_customers  &&  $month == $today OR ($donnees['month']) == $month) {    
          
                         echo   ' 
                            <section >
                            <div class="alert alert-danger">
                                   <ul> 
                                   la quittance pour <b>'.$donnees['showin'].' </b> est deja ouverte pour ce mois-ci.
                                  </ul>
                                  </div>
                              </section>
                                  ';
          
          
                            } else {
          
          
                             $id = $_SESSION['auth']->id; 
                             $stmt = $db->query("  SELECT next_new_invoice  FROM users WHERE   ".$_SESSION['auth']->id." = id", PDO::PARAM_STR);
                             $stmt->bindValue("id", $id, PDO::PARAM_INT);
                             $donnees = $stmt->fetch();
          
                             //echo $donnees['next_new_invoice'];
                             $id_invoice = $donnees['next_new_invoice'];
                            //$id_invoice++;
          
          
                             //echo $id_invoice;
                             $id_invoice++; echo '<br>';  
                             // echo $id_invoice;
          
                             $receipt=$id_invoice;
                             $stmt = $db->prepare("INSERT INTO receipt (receipt, id_customers,  room_number, month, year)  VALUES(:receipt, :id_customers,  :room_number , :month, :year)");
                             $stmt->bindParam("id_customers", $id_customers,PDO::PARAM_INT);
                             $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                             $stmt->bindParam("room_number", $room_number,PDO::PARAM_INT);
                             $stmt->bindParam(':month', $month,PDO::PARAM_STR);
                             $stmt->bindParam(':year', $year,PDO::PARAM_STR);
                             $stmt->execute();
          
                             $receipt=$id_invoice;
                             $stmt = $db->prepare("INSERT INTO state (id_state, receipt, creation_date) VALUES(:id_state,  :receipt , :creation_date )");
                             $stmt->bindParam("id_state", $id_state,PDO::PARAM_INT);
                             $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                             $stmt->bindParam(':creation_date', $creation_date,PDO::PARAM_STR);
          
                             $stmt->execute();
          
          
                      //mise à jour du prochain numéro de quittance
                             $next_new_invoice=$id_invoice;
                      //echo  $next_new_invoice;
                             $stmt = $db->prepare("UPDATE users SET  next_new_invoice='$next_new_invoice'  WHERE ".$_SESSION['auth']->id." = id" );
                             $stmt->bindParam('next_new_invoice', $_GET['next_new_invoice'], PDO::PARAM_INT);
                             $stmt->bindValue("id", $id, PDO::PARAM_INT);
                             $stmt->execute();
          
                         }
          
          
                     }
          
          
          
          
          
          
                    //---------------------------------------------------//
                  // On récupère proprement les variables envoyées 
                  // en $_POST  AVANT de les utiliser
                  // pour cela, j'utilise l'écriture ternaire : https://blog.smarchal.com/operateur-ternaire-php#:~:text=L'op%C3%A9rateur%20ternaire%20est%20un,%5BTHEN%5D%20%3A%20%5BELSE%5D%3B
                  //---------------------------------------------------//
          
                     $receipt = !empty($_POST["receipt"]) ? $_POST["receipt"] : NULL;
                     $id_customers = !empty($_POST["id_customers"]) ? $_POST["id_customers"] : NULL;
                     $room_number = !empty($_POST["room_number"]) ? $_POST["room_number"] : NULL;
                     $id_state = !empty($_POST["id_state"]) ? $_POST["id_state"] : NULL;
                     $creation_date = !empty($_POST["creation_date"]) ? $_POST["creation_date"] : NULL;
                     $month = !empty($_POST["month"]) ? $_POST["month"] : NULL;
                     $year = !empty($_POST["year"]) ? $_POST["year"] : NULL;
          
                     $next_new_invoice = !empty($_POST["next_new_invoice"]) ? $_POST["next_new_invoice"] : NULL;
          
                     $createReceipt = isset($_POST["createReceipt"]) ? $_POST["createReceipt"] : NULL;
          
          
          
          
          
          
                  //---------------------------------------------------//
                  // Traitement du formulaire
                  //---------------------------------------------------//
                     if(!empty($_POST)) {
          
                      $errors =array();
          
          
                     // Si il n'y a pas d'erreurs ...
                     if(empty($errors)) {
          
          
                       if(isset($createReceipt)){ 
                       //On crée la quittance si toutes les conditions sont réunies
                          creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice );  
                     // header('Location: ../array/receipts.php');
                       echo "<script type='text/javascript'>document.location.replace('../array/receipts.php');</script>";
                       exit; //toujours mettre un exit après une redirection
                   } 
          
          
               }
           }
      2. Merci Jorane, je vais essayer ça.

        Je met des copies d'écran des tables avec des données dedans.

        Table state

        table receipt (quittance)

        Table rooms

        Table customers

        1. J'ai les  messages d'erreur ci-dessous :

          ( ! ) Notice: Undefined variable: roomNumber in C:\wamp64\www\24\app\process\receipts.php on line 110
          
           Notice: Undefined variable: mois in C:\wamp64\www\24\app\process\receipts.php on line 110
          ( ! ) Notice: Undefined variable: roomNumber in C:\wamp64\www\24\app\process\receipts.php on line 115
          
          Notice: Undefined variable: mois in C:\wamp64\www\24\app\process\receipts.php on line 116
                  <?php
          
                  if(session_status() == PHP_SESSION_NONE){
                      session_start();
                  }
                  
          
                  /*Avant l'insertion de la quittance, vérifier si la quittance n'est pas déjà ouverte pour ce 
                    locataire pour le mois courant.
                  */
          
                  //---------------------------------------------------------------//
                  //connexion à la bdd
                  // A lire et à appliquer avant de poursuivre :
                  // http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
                  //---------------------------------------------------------------//
                      require_once('../inc/connexion.php');
          
                      /**
                      * Fonction pour créer une quittance
                      */
          
                  
                      function creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice ){
                      $db = getDB();
                      $id = $_SESSION['auth']->id; 
                      $stmt = $db->query("  SELECT next_new_invoice  FROM users WHERE   ".$_SESSION['auth']->id." = id", PDO::PARAM_STR);
                      $stmt->bindValue("id", $id, PDO::PARAM_INT);
                      $donnees = $stmt->fetch();
          
                      //echo $donnees['next_new_invoice'];
                      $id_invoice = $donnees['next_new_invoice'];
                      //$id_invoice++;
             
          
                      //echo $id_invoice;
                      $id_invoice++; echo '<br>';  
                     // echo $id_invoice;
          
                      $receipt=$id_invoice;
                      $stmt = $db->prepare("INSERT INTO receipt (receipt, id_customers,  room_number)  VALUES(:receipt, :id_customers,  :room_number)");
                      $stmt->bindParam("id_customers", $id_customers,PDO::PARAM_INT);
                      $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                      $stmt->bindParam("room_number", $room_number,PDO::PARAM_INT);
                      $stmt->execute();
          
                      $receipt=$id_invoice;
                      $stmt = $db->prepare("INSERT INTO state (id_state, receipt, creation_date, month, year) VALUES(:id_state,  :receipt , :creation_date, :month, :year )");
                      $stmt->bindParam("id_state", $id_state,PDO::PARAM_INT);
                      $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                      $stmt->bindParam(':creation_date', $creation_date,PDO::PARAM_STR);
                      $stmt->bindParam(':month', $month,PDO::PARAM_STR);
                      $stmt->bindParam(':year', $year,PDO::PARAM_STR);
                      $stmt->execute();
          
          
                      //mise à jour du prochain numéro de quittance
                      $next_new_invoice=$id_invoice;
                      //echo  $next_new_invoice;
                      $stmt = $db->prepare("UPDATE users SET  next_new_invoice='$next_new_invoice'  WHERE ".$_SESSION['auth']->id." = id" );
                      $stmt->bindParam('next_new_invoice', $_GET['next_new_invoice'], PDO::PARAM_INT);
                      $stmt->bindValue("id", $id, PDO::PARAM_INT);
                      $stmt->execute();
          
                      }
          
                   
          
                    //---------------------------------------------------//
                  // On récupère proprement les variables envoyées 
                  // en $_POST  AVANT de les utiliser
                  // pour cela, j'utilise l'écriture ternaire : https://blog.smarchal.com/operateur-ternaire-php#:~:text=L'op%C3%A9rateur%20ternaire%20est%20un,%5BTHEN%5D%20%3A%20%5BELSE%5D%3B
                  //---------------------------------------------------//
          
                  $receipt = !empty($_POST["receipt"]) ? $_POST["receipt"] : NULL;
                  $id_customers = !empty($_POST["id_customers"]) ? $_POST["id_customers"] : NULL;
                  $room_number = !empty($_POST["room_number"]) ? $_POST["room_number"] : NULL;
                  $id_state = !empty($_POST["id_state"]) ? $_POST["id_state"] : NULL;
                  $creation_date = !empty($_POST["creation_date"]) ? $_POST["creation_date"] : NULL;
                  $month = !empty($_POST["month"]) ? $_POST["month"] : NULL;
                  $year = !empty($_POST["year"]) ? $_POST["year"] : NULL;
          
                  $next_new_invoice = !empty($_POST["next_new_invoice"]) ? $_POST["next_new_invoice"] : NULL;
          
                  $createReceipt = isset($_POST["createReceipt"]) ? $_POST["createReceipt"] : NULL;
          
          
          
          
          
          
                  //---------------------------------------------------//
                  // Traitement du formulaire
                  //---------------------------------------------------//
                  if(!empty($_POST)) {
          
                  $errors =array();
          
          
          
                
          
          
          
          
          
          
                    $db = getDB();
                    $stmt = $db->query("SELECT * FROM  `state` S LEFT JOIN receipt R ON R.receipt  = S.receipt WHERE id_customers = '$id_customers'
                    AND  room_number  = '$roomNumber' AND S.month = '$mois' ");
                    $donnees = $stmt->fetch();
          
          
                     echo  $id_customers ; echo '<br';
                     echo  $roomNumber ;  echo '<br';
                     echo $mois ;
          
          
                        
          
            
          
                     // Si il n'y a pas d'erreurs ...
                   if(empty($errors)) {
          
          
                   if(isset($createReceipt)){ 
                       //On crée la quittance si toutes les conditions sont réunies
                      creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice );  
                     // header('Location: ../array/receipts.php');
                   //  echo "<script type='text/javascript'>document.location.replace('../array/receipts.php');</script>";
                       exit; //toujours mettre un exit après une redirection
                  } 
          
          
          }
          }
          1. Modérateur
            <?php
            
            
              if(session_status() == PHP_SESSION_NONE){
                  session_start();
              }
              
            
              /*Avant l'insertion de la quittance, vérifier si la quittance n'est pas déjà ouverte pour ce 
                locataire pour le mois courant.
              */
            
              //---------------------------------------------------------------//
              //connexion à la bdd
              // A lire et à appliquer avant de poursuivre :
              // http://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
              //---------------------------------------------------------------//
                require_once('../inc/connexion.php');
            
                  /**
                  * Fonction pour créer une quittance
                  */
            
            
                  function creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice ){
            
            
                      $db = getDB();
                      
                      $sql = " SELECT receipt.id_customers, showin, month 
                                FROM receipt 
                                LEFT JOIN customers ON (receipt.id_customers=customers.id_customers)
                                WHERE receipt.id_customers = '$id_customers' AND month='$month'";
                      $stmt = $db->query($sql);
            
                      $donnees = $stmt->fetch();
            
                     if (!empty($donnees)) {    
            
                       echo   ' 
                          <section >
                          <div class="alert alert-danger">
                                 <ul> 
                                 la quittance pour <b>'.$donnees['showin'].' </b> est deja ouverte pour ce mois-ci.
                                </ul>
                                </div>
                            </section>
                                ';
                        return false;
            
                     } else {
            
            
                         $id = $_SESSION['auth']->id; 
                         $stmt = $db->query("  SELECT next_new_invoice  FROM users WHERE   ".$_SESSION['auth']->id." = id", PDO::PARAM_STR);
                         $stmt->bindValue("id", $id, PDO::PARAM_INT);
                         $donnees = $stmt->fetch();
            
                         //echo $donnees['next_new_invoice'];
                         $id_invoice = $donnees['next_new_invoice'];
                        //$id_invoice++;
            
            
                         //echo $id_invoice;
                         $id_invoice++; echo '<br>';  
                         // echo $id_invoice;
            
                         $receipt=$id_invoice;
                         $stmt = $db->prepare("INSERT INTO receipt (receipt, id_customers,  room_number, month, year)  VALUES(:receipt, :id_customers,  :room_number , :month, :year)");
                         $stmt->bindParam("id_customers", $id_customers,PDO::PARAM_INT);
                         $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                         $stmt->bindParam("room_number", $room_number,PDO::PARAM_INT);
                         $stmt->bindParam(':month', $month,PDO::PARAM_STR);
                         $stmt->bindParam(':year', $year,PDO::PARAM_STR);
                         $stmt->execute();
                         
                         $receipt=$id_invoice;
                         $stmt = $db->prepare("INSERT INTO state (id_state, receipt, creation_date) VALUES(:id_state,  :receipt , :creation_date )");
                         $stmt->bindParam("id_state", $id_state,PDO::PARAM_INT);
                         $stmt->bindParam("receipt", $receipt,PDO::PARAM_INT);
                         $stmt->bindParam(':creation_date', $creation_date,PDO::PARAM_STR);
                         $stmt->execute();
                         
                        //mise à jour du prochain numéro de quittance
                         $next_new_invoice=$id_invoice;
                        //echo  $next_new_invoice;
                         $stmt = $db->prepare("UPDATE users SET  next_new_invoice='$next_new_invoice'  WHERE ".$_SESSION['auth']->id." = id" );
                         $stmt->bindParam('next_new_invoice', $_GET['next_new_invoice'], PDO::PARAM_INT);
                         $stmt->bindValue("id", $id, PDO::PARAM_INT);
                         $stmt->execute();
                        
                         return true;
                     }
            
            
                 }
            
            
            
            
            
            
                //---------------------------------------------------//
              // On récupère proprement les variables envoyées 
              // en $_POST  AVANT de les utiliser
              // pour cela, j'utilise l'écriture ternaire : https://blog.smarchal.com/operateur-ternaire-php#:~:text=L'op%C3%A9rateur%20ternaire%20est%20un,%5BTHEN%5D%20%3A%20%5BELSE%5D%3B
              //---------------------------------------------------//
            
                 $receipt = !empty($_POST["receipt"]) ? $_POST["receipt"] : NULL;
                 $id_customers = !empty($_POST["id_customers"]) ? $_POST["id_customers"] : NULL;
                 $room_number = !empty($_POST["room_number"]) ? $_POST["room_number"] : NULL;
                 $id_state = !empty($_POST["id_state"]) ? $_POST["id_state"] : NULL;
                 $creation_date = !empty($_POST["creation_date"]) ? $_POST["creation_date"] : NULL;
                 $month = !empty($_POST["month"]) ? $_POST["month"] : NULL;
                 $year = !empty($_POST["year"]) ? $_POST["year"] : NULL;
            
                 $next_new_invoice = !empty($_POST["next_new_invoice"]) ? $_POST["next_new_invoice"] : NULL;
            
                 $createReceipt = isset($_POST["createReceipt"]) ? $_POST["createReceipt"] : NULL;
            
            
              //---------------------------------------------------//
              // Traitement du formulaire
              //---------------------------------------------------//
                 if(!empty($_POST)) {
            
                  $errors =array();
            
            
                 // Si il n'y a pas d'erreurs ...
                 if(empty($errors)) {
            
            
                   if(isset($createReceipt)){ 
                   //On crée la quittance si toutes les conditions sont réunies
                      $result = creaReceipt($receipt, $id_customers, $room_number, $id_state, $creation_date, $month, $year, $next_new_invoice );  
                   if( $result == true ){ 
                      // header('Location: ../array/receipts.php');
                      echo "<script type='text/javascript'>document.location.replace('../array/receipts.php');</script>";
                      exit; //toujours mettre un exit après une redirection
                   }
               } 
            
            
            }
            }