Mise à jour de formulaire

Signaler
Messages postés
41
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
25 juin 2020
-
Messages postés
41
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
25 juin 2020
-
Bonjour, j'ai une liste de table à laquelle j'ai ajouté une colonne à écrire. Tout marche sauf qu'à chaque modification (colonne peniche) il n'enregistre que la 1ère valeur sur tous les champs. au lieu d'enregistrer une peniche pour une commade Voici le code pour plus de compréhension. Merci d'avance.
NB: j'ai omis quelques informations.
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8"/>
 <title>Recherche</title>
 <style>
  table{width:100%;border-collapse:collapse}
  table tr,table th,table td{border:1px solid black;}
  table tr td{text-align:center;padding:1em;}
 </style>
</head>
<body>
 <?php include('connection_database.php');?>
 <form method='post' action='#'>
  <label for="date_reception_log">Date réception : </label>
   <input type='date' placeholder='date_reception' name="date_reception"/>
  <label for="date_transmission">Date transmission : </label>
   <input type='date' placeholder='date_transmission' name="date_transmission"/>
        
   
   <input type='submit' value="Envoyer" name="Envoyer"/>
 <table>
  <thead>
   <tr>
      <th>Choisir</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>

   </th>
   
   </tr>
  </thead>
  <tbody>
   <?php
    $sql='select * from ...'; 

    $params=[];
    if(isset($_POST['numerocompte'])&& ($_POST['date_reception_log']) && ($_POST['date_transmission_at'])&& ($_POST['peniche'])){
     ' UPDATE commande SET
        date_reception_log=:date_reception, 
        date_transmission_at=:date_transmission
        peniche=:peniche

        WHERE id = :id ';
      $params[':numerocompte']="%".addcslashes($_POST['numerocompte'],'_')."%";
      $params[':date_reception']="%".addcslashes($_POST['date_reception'],'_')."%";
      $params[':date_transmission']="%".addcslashes($_POST['date_transmission'],'_')."%";
      $params[':peniche']="%".addcslashes($_POST['peniche'],'_')."%";

     }
    $resultats=$connect->prepare($sql);
    $resultats->execute($params);
    if($resultats->rowCount()>0){
     while($d=$resultats->fetch(PDO::FETCH_ASSOC)){
     ?>
      <tr>
         <td><input type='checkbox' name='listeCmd[]' value="<?php echo $d['numerocompte']; ?>"></td>
      <td><?=$d['']?></td>
      <td><?=$d['']?></td>
      <td><?=$d['']?></td>
      <td><?=$d['']?></td>
      <td><?=$d['']?></td>
      <td><?=$d['']?></td>
      <td><?=$d['']?></td><td>
      <input type='varchar' id="peniche" name="peniche" value="<?php echo $d['peniche']; ?>"></td></tr>

      
     <?php
     }
     $resultats->closeCursor();
    }
    else echo '<tr><td colspan=4>aucun résultat trouvé</td></tr>'.
    $connect=null;
   ?>
  </tbody>
 </table>
 </form>
<?php 
   if(isset($_POST['Envoyer']))
   {
    try{
     $serveur = "localhost";
     $dbname = "#";
     $user = "root";
     $pass = "";

     $date_reception = $_POST["date_reception"];
     $date_transmission = $_POST["date_transmission"];
     $peniche = $_POST["peniche"];

     $lesNumeroCompte;
     echo 'date 1 ' .$_POST["date_reception"];
     echo 'date 2 ' .$_POST["date_transmission"];
     echo 'peniche ' .$_POST["peniche"];

     if(!isset($_POST['date_reception_log']) || $_POST['date_reception']==''){
      echo '<script>alert("Veuillez saisir la date reception")</script>';
      return;
     }
     if(!isset($_POST['date_transmission_at']) || $_POST['date_transmission_at']==''){
      echo '<script>alert("Veuillez saisir la date transmission")</script>';
      return;
     }
     if(!isset($_POST['peniche']) || $_POST['peniche']==''){
      echo '<script>alert("Veuillez saisir la péniche SVP")</script>';
      return;
     }
     if(empty($_POST["listeCmd"])){
      echo '<script>alert("Veuillez choisir une commande")</script>';
      return;
     }
     else{
      $lesNumeroCompte = $_POST["listeCmd"]; 
     }

     $liste = "(";
     //On se connecte à la BDD
     $dbco = new PDO("mysql:host=$serveur;dbname=$dbname",$user,$pass);
     $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
     //On insère les données reçues
     echo 'date_reception_log : '.$date_reception_log;
     echo 'date_transmission_at : '.$date_transmission_at;
     echo 'peniche : '.$peniche;

     // on cree la liste des id que l'on doit mettre à jour
     foreach ($lesNumeroCompte as $numerocompte) {
      echo 'aaaaa ' . $numerocompte;
      $liste .= "'". $numerocompte . "',";
     }
     $liste = substr($liste, 0, -1);  
     $liste .= ")";
     echo 'liste : '.$liste;
     $sth = $dbco->prepare("
      UPDATE commande
      SET date_reception_log=:date_reception_log, date_transmission_at=:date_transmission_at, peniche=:peniche
      WHERE numerocompte in " .$liste ); 
      
     $sth->bindParam(':date_reception_log',$date_reception_log,PDO::PARAM_STR);
     $sth->bindParam(':date_transmission_at',$date_transmission_at,PDO::PARAM_STR);
     $sth->bindParam(':peniche',$peniche,PDO::PARAM_STR);

       // $sth->bindParam(':numerocompte',$liste,PDO::PARAM_STR);
     $sth->execute();
     
     //On renvoie l'utilisateur vers la page de remerciement
     header("Location:espacelogistique.php");
    }
    catch(PDOException $e){
     echo 'Impossible de traiter les données. Erreur : '.$e->getMessage();
    }
    //if (!empty($_POST['checked']))
    //{ 
     //foreach(($_POST['checked']) as $checked)
     //echo $checked."<br/>";
    //}
    //else
     //echo "selectionner au moins un numéro de compte";
   }
  ?>
 </body>
</html>

3 réponses

Messages postés
11513
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
bonjour, pour que nous comprenions, ajoute print_r($_POST) avant la ligne 87;
pour que tu comprennes, ajoute print_r() de $liste ,$date_reception_log, ,$date_transmission_at, $peniche avant la ligne 147.
et montre-nous tout cela.
Messages postés
11513
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
10 juillet 2020
659
montre aussi la source html de la page affichée
Messages postés
28938
Date d'inscription
mercredi 22 octobre 2003
Statut
Modérateur
Dernière intervention
10 juillet 2020
2 609
Bonjour,

Quelques règles à suivre pour avoir un code propre et "facile" à debuguer
on place le maximum de code php en dehors du html ( de préférence au début du script)
on active l'affichage des erreurs PDO et PHP
- https://www.commentcamarche.net/faq/46512-pdo-gerer-les-erreurs
- https://www.commentcamarche.net/faq/48399-php-gestion-des-erreurs-debogage-et-ecriture-du-code
on essaye de découper en fonctions
on récupère proprement les variables AVANT de les utiliser



En gros ça devrait donner un truc du genre :
<?php
//----------------------------------------------//
//Affichage des erreurs php
//----------------------------------------------//
error_reporting(E_ALL);
ini_set('display_errors', TRUE);
ini_set('display_startup_errors', TRUE);

//----------------------------------------------//
//fonctions
//----------------------------------------------//
  // Connexion à la bdd
  function getDb(){
      $serveur = "localhost";
      $dbname = "#";
      $user = "root";
      $pass = ""; 
    try{
      //On se connecte à la BDD
      $dbco = new PDO("mysql:host=$serveur;dbname=$dbname",$user,$pass);
      $dbco->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
      $dbco->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
    } catch(PDOException $e) {
        die('Erreur : ' . $e->getMessage());
    }
    return $dbco;
  }
  
  function getAll(){
    $bdd = getDb();
    $sql='select * from ...'; 
    //Execution de la requete
    try{
      $requete = $bdd -> prepare($sql) ;
      $requete->execute() ;
      return $requete->fetchAll(); // on retourne un array avec tous les résultats
    }catch(Exception $e){
      // en cas d'erreur :
       echo " Erreur ! ".$e->getMessage();     
    }
  }
  
  
  function updCommande($date_reception_log,$date_transmission_at,$peniche,$lesNumeroCompte=array()){
    $bdd = getDb();
    
    $liste = join("','",$lesNumeroCompte);
    
    $sql = "UPDATE commande
            SET date_reception_log=:date_reception_log, 
                date_transmission_at=:date_transmission_at, 
                peniche=:peniche
            WHERE numerocompte in ('" .$liste . "')" ;
            
    try{
      $sth = $dbco->prepare($sql);
      $sth->bindParam(':date_reception_log',$date_reception_log,PDO::PARAM_STR);
      $sth->bindParam(':date_transmission_at',$date_transmission_at,PDO::PARAM_STR);
      $sth->bindParam(':peniche',$peniche,PDO::PARAM_STR);
      return $sth->execute();
    }catch(Exception $e){
       echo " Erreur ! ".$e->getMessage();     
    } 
          
  }  
  

//----------------------------------------------//
//récupération des variables
//----------------------------------------------//
 $date_reception = !empty($_POST["date_reception"]) ? $_POST["date_reception"] : '';
 $date_transmission = !empty($_POST["date_transmission"]) ? $_POST["date_transmission"] : '';
 $peniche = !empty($_POST["peniche"]) ? $_POST["peniche"] : '';
 $date_reception_log = !empty($_POST["date_reception_log"]) ? $_POST["date_reception_log"] : '';
 $date_reception = !empty($_POST["date_reception"]) ? $_POST["date_reception"] : '';
 $date_transmission_at = !empty($_POST["date_transmission_at"]) ? $_POST["date_transmission_at"] : '';
 $lesNumeroCompte =  !empty($_POST["listeCmd"]) ? $_POST["listeCmd"] : '';; 
 
//----------------------------------------------//
// Traitement du formulaire
//----------------------------------------------//
  
  //le temps des tests :
  echo "<pre>Variables POST : <br>";
  print_r($_POST);
  echo "</pre>";


if(isset($_POST['Envoyer']))  {
     echo 'date 1 ' .$date_reception;
     echo 'date 2 ' .$date_transmission;
     echo 'peniche ' .$peniche;

    if(!isset($date_reception_log) || $date_reception==''){
      echo '<script>alert("Veuillez saisir la date reception")</script>';
    }
    
    if(!isset($date_transmission_at) || $date_transmission_at ==''){
      echo '<script>alert("Veuillez saisir la date transmission")</script>';
    }
    
    if(!isset($peniche) || $peniche == ''){
      echo '<script>alert("Veuillez saisir la péniche SVP")</script>';
    }
     
    if(empty($lesNumeroCompte)){
      echo '<script>alert("Veuillez choisir une commande")</script>';
    } 
  
    if( updCommande($date_reception_log,$date_transmission_at,$peniche,$lesNumeroCompte)) {
      //On renvoie l'utilisateur vers la page de remerciement
      //header("Location:espacelogistique.php"); // on desactive la redirection le temps des tests
      echo "Update OK !";
      exit(); //toujours mettre un exit après une redirection.
   }
}

?>
<!DOCTYPE html>
<html>
<head>
 <meta charset="utf-8"/>
 <title>Recherche</title>
 <style>
  table{width:100%;border-collapse:collapse}
  table tr,table th,table td{border:1px solid black;}
  table tr td{text-align:center;padding:1em;}
 </style>
</head>
<body>
 <?php include('connection_database.php');?>
 <form method='post' action='#'>
  <label for="date_reception_log">Date réception : </label>
   <input type='date' placeholder='date_reception' name="date_reception"/>
  <label for="date_transmission">Date transmission : </label>
   <input type='date' placeholder='date_transmission' name="date_transmission"/>
        
   
   <input type='submit' value="Envoyer" name="Envoyer"/>
 <table>
  <thead>
   <tr>
      <th>Choisir</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>
   <th>#</th>

   </th>
   
   </tr>
  </thead>
  <tbody>
   <?php
    
    $resultats = getAll();
    
    if(!empty($resultats) ) {
      foreach( $resultats as $d){
     ?>
      <tr>
         <td><input type='checkbox' name='listeCmd[]' value="<?php echo $d['numerocompte']; ?>"></td>
        <td><?=$d['']?></td>
        <td><?=$d['']?></td>
        <td><?=$d['']?></td>
        <td><?=$d['']?></td>
        <td><?=$d['']?></td>
        <td><?=$d['']?></td>
        <td><?=$d['']?></td><td>
        <input type='varchar' id="peniche_<?php echo $d['peniche']; ?>" name="peniche" value="<?php echo $d['peniche']; ?>"></td>
      </tr>
     <?php
     }
    } else {
      echo '<tr><td colspan=4>aucun résultat trouvé</td></tr>'.
    }

   ?>
  </tbody>
 </table>
 </form>
 </body>
</html>


Par contre, je suis un peu dubitatif sur le résultat souhaité avec ce code....
As tu testé la requête DIRECTEMENT dans ta bdd ( via phpmyadmin par exemple) avant d'essayer de la mettre en pratique dans ton code php ?
Ton formulaire ne contient qu'une donnée... les cases à cocher... les autres variables ne sont pas dedans.. c'est normal ??


Messages postés
41
Date d'inscription
mercredi 11 décembre 2019
Statut
Membre
Dernière intervention
25 juin 2020

Bonjour, merci de m'avoir répondu. Oui c'est normal, le but c'est de cocher les cases (une, deux ou plusieurs), remplir le formulaire (date réception et date transmission) , remplir la colonne "peniche"(chaque ligne une peniche) et le système fait la mise à jour en fonction du numerocompte. La requête marchait très bien jusqu'à ce qu'on m'a fait une suggestion (une peniche pour une commande au lieu de une peniche pour plusieurs commandes ). La peniche faisait parti du formulaire mais maintenant je lui ai crée une colonne. Mon soucis est à chaque fois il prend la peniche de la 1ere commande et l'enregistre sur les autres. Je penses que c'est plus clair maintenant. Merci