Selectionner dans un select l'option choisie précédement par l'utilisateur

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - Modifié le 19 nov. 2021 à 09:18
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 19 nov. 2021 à 14:02
Bonjour à tous,

Existe t-il un moyen quand on revient sur un formulaire de ré-afficher ce qui avait
été sélectionné par l'utilisateur dans des select avant l'envoi ?
J'ai essayé avec des variables de session, au retour sur la page formulaire un echo
me donne les bonnes valeurs, donc cette partie fonctionne mais je ne sais pas comment interagir sur les select avec l'option 'selected' !
J'ai essayé avec un truc du genre : ($choix=='infos'?'selected':NULL); mais ça ne va pas !
J'ai essayé aussi avec un if au beau milieu de mon foreach mais du coup le select restait vide !
Et comme un peu de code vaut mieux qu'un long discours :


contrat-ajout1.php
Clients avec un S pour alimenter le select des clients récupérés dans la bdd
Client sans s pour la variable de session et le select


<?php
    // Requêtes pour formulaire :
    // CLIENTS    
    $requete1 = $bdd->query('SELECT * FROM clients ORDER by nom, prenom');
    // on stocke le résultat de la requête dans un Array
    $clients = $requete1->fetchAll();
    // Si la variable client n'existe pas on créé les variables de session :
    if (empty($_SESSION['client'])){ 
        $client = '';  
    }
    // Sinon récupération des variables de session :
    else{    
        $client = $_SESSION['client']; 
        echo $client;  // RENVOI BIEN L'ID DU CLIENT PRÉCÉDEMMENT SÉLECTIONNÉ 
    }

?>

<select name="client" id="client" required="">
    <option value="" selected disabled hidden>Sélectionnez un client</option>
     <?php
        foreach($clients as $valeur) {
            echo '<option value="' . $valeur['id_client'] . '">' . $valeur['nom'] . ' ' . $valeur['prenom'] . '</option>';
        }
    ?>
</select>



contrat-ajout2.php
if (isset($_POST["chaine_contrat"]) && $_POST["chaine_contrat"]!="") {
        // Connexion à la base de données :
        require("connexion.php");       
        // Récupération des données formulaire :
        $client = $_POST['client'];        
        //Requête préparée pour l'ajout :
        $requete = $bdd->prepare('INSERT INTO contrats(id_client) 
   VALUES(:id_client)');
        // Exécution de la requête :
        $requete->execute(array(                
                'id_client' => $client
        ));
    } else { //Le contrat est renseigné SANS prestations !  
  //récupération PROPRE des variables AVANT de les utiliser
  $client = !empty($_POST['client']) ? $_POST['client']: NULL;

  //récupération des saisies formulaire :
  $_SESSION['client'] = htmlspecialchars($client);  

  // Message d'alerte et retour au formulaire
        echo "Vous avez oublié les prestations du contrat";
        header('Refresh: 3; URL= contrat-ajout1.php');
    }




Configuration: Linux / Firefox 94.0

5 réponses

Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
19 nov. 2021 à 09:56
Bonjour,

Une solution possible avec l'opérateur ternaire :
foreach($clients as $valeur) {
    echo '<option value="' . $valeur['id_client'] . '"' . ($client == $valeur['id_client'] ? ' selected' : '')  . '>' . $valeur['nom'] . ' ' . $valeur['prenom'] . '</option>';
}

1
Pitet Messages postés 2826 Date d'inscription lundi 11 février 2013 Statut Membre Dernière intervention 21 juillet 2022 525
19 nov. 2021 à 12:33
Tu devrais pouvoir utiliser le même principe pour l'input date :
<input type="date" id="date_debut" name="date_debut" required value="<?php echo !empty($date_debut) ? $date_debut : ''; ?>">


Attention néanmoins au format de la date, l'input html de type date attend une date au format "Y-m-d". Si la variable $date_debut est une chaine de caractères et que la date n'est pas dans le bon format, tu peux utiliser strtotime pour l'afficher avec le bon format :
<input type="date" id="date_debut" name="date_debut" required value="<?php echo !empty($date_debut) ? date("Y-m-d", strtotime($date_debut)) : ''; ?>">
1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
19 nov. 2021 à 11:53
C'est exactement ce que je voulais, MERCI Pitet !!!

Pour les autres champs de mon formulaire qui ne sont pas des select, je ne trouve pas comment faire non plus, j'ai essayé ça :

<input type="date" id="date_debut" name="date_debut" required="" <?php echo $date_debut; ?> >

<input type="number" id="adultes" name="adultes" required="" value ="<?php ($adultes<>'' ? echo $adultes :0); ?>"><br>
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
19 nov. 2021 à 11:59
Ça, ça fonctionne ! ;-)

<input type="number" id="adultes" name="adultes" required="" value ="<?php echo($adultes <>'' ? $adultes :0); ?>"><br>


Mais pas trouvé pour la date !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
19 nov. 2021 à 14:02
Et bien voila, tu viens de régler mon problème, je t'en remercie...
En ce qui concerne la date, je n'ai pas de problème particulier (en production locale
en tous cas), ta première solution fonctionne donc bien :
- L'input avant saisie affiche bien jj/mm/aaaa
- Le clic sur le champ ouvre bien le sélecteur de date (sous Firefox),
- La requête s'effectue avec un $date_debut = $_POST['date_debut'];
- Le type de data dans la bdd est bien date
- Et la récupération dans une variable de session au cas ou le formulaire ne serait pas
renseigné complètement :
$date_debut = !empty($_POST['date_debut']) ? $_POST['date_debut']: NULL;
$_SESSION['date_debut'] = htmlspecialchars($date_debut);
.../...
$date_debut = $_SESSION['date_debut'];

C'est parfait !
0