8795 sujets

Développement web côté serveur, CMS

Bonjour,

un nouveau problème se présente à moi,
je vous explique :

j'ai un formulaire avec un nom, une liste déroulante avec des option que je vais chercher dans ma bdd
lorsque je sélectionne un choix dans cette liste, je voudrais faire apparaître une nouvelle liste déroulante que je vais chercher dans ma bdd.

La difficulté c'est d'afficher la liste sans validation. voici un peu de code (j'ai commencé un peu de js mais sans conviction)

 <form action="process.php" method="post" name="form_ticket">
                        <fieldset><legend class="legende">Contacter le support</legend>
                            <label for="nom" class="libele">Nom</label>
                            <input type="text" name="nom" id="nom" size="30" /><br>
                            <label for="client" class="libele">Client</label>
                            <SELECT name="client" id="client" size="1">
                                <option selected>Client...</option>
                                <?php
                                $sql = $cnx->query('SELECT * FROM clients');
                                while($row = $sql->fetch())
                                { ?>
                                    <option value="<?php echo $row['IDClient']; ?>"><?php echo $row['Nom']; ?></option>
                                <?php } ?>
                            </SELECT>
                            <script type="text/javascript">
                            $(document).ready(function() {
                                $('#systeme').hide(); //je cache le champ par défaut

                                $('select[name="client"]').change(function(){ //lorsqu'on change de valeur dans la liste
                                    if(valeur != '') {  //si non vide
                                        if(valeur == '<?php echo $row['IDClient']; ?>') { //si client selectionné
                                            $
                                        }
                                    }
                                });
                            });
                            </script>
                        </fieldset>
                    </form>


pour la partie js, j'étais partie sur ça http://fr.openclassrooms.com/forum/sujet/afficher-un-input-sur-choix-d-une-liste-deroulante-36903http://fr.openclassrooms.com/forum/sujet/afficher-un-input-sur-choix-d-une-liste-deroulante-36903[/url
et le
$('#systeme').hide()

correspond a un select de ma liste caché
Modifié par cid5420 (20 Jan 2014 - 17:47)
Salut,
ce que tu as fait ne peut pas marcher, tu boucles sur tes clients et affiche l'option, jusque là ça va, puis un peu plus tard (dans la partie js de ton code) tu n'affiches qu'un seul id client (en théorie le dernier retourné ou rien). Je serai toi, je chargerai la seconde liste en asynchrone, tu fais une requête ajax contenant l'id de ton client, et ça te renvoi ta liste que tu réinjectes dans le formulaire. Sinon tu peux aussi charger tout, c'est à dire tes différentes listes secondaires, tu les masques en css de base, et en js tu affiches celle voulue en fonction de la value de la liste principale, c'est je crois ce que tu as voulu faire.
P.S: ne fait pas de select *, choisis seulement les champs dont tu as besoin, c'est plus sécurisé.
Bon courage Smiley smile
Oui le code que j'ai édité ne fonctionne pas vue que j'ai écrit une partie mais je me suis rendu compte que ça ne pouvais pas fonctionner.

Qu'entend tu par asynchrone ? c'est une fonction js ? un autre langage ?

Pourrais tu me donner plus de détail sur la structure?

De plus tu me dis de ne pas faire de SELECT mais c'est pas obligatoire pour une liste déroulante? Sinon comment faire?
non le post scriptum concernait ta requête SQL Smiley cligne

Pour l'asynchrone, je sous entendais de faire une requête ajax sur l'événement on change de ta liste principale.

Pour la structure de ta solution tu peux faire dans le genre:

<select name="client" id="client" size="1">
                                <option selected>Client...</option>
                                <?php
                                $sql = $cnx->query('SELECT * FROM clients');
                                while($row = $sql->fetch())
                                { ?>
                                    <option value="<?php echo $row['IDClient']; ?>"><?php echo $row['Nom']; ?></option>
                                <?php } ?>
                            </select>

<select name="bidule-id1" id="bidule-id1" class="liste-secondaire">
<option></option>
<option></option>
</select>

<select name="bidule-id2" id="bidule-id2" class="liste-secondaire">
<option></option>
<option></option>
</select>

...


Un display none sur tous les select de la classe "liste-secondaire", et lorsque tu fais le onchange sur la première liste, tu récupères l'id qui est la value de l'option sélectionnée, puis ayant l'id tu peu afficher la liste secondaire correspondant puisque tu as bidule-idxxx. Vois tu mieux? Tu seras probablement obligé de mettre dans une variable le contenu de tes selects pour pouvoir parcourir dans une seule boucle tous tes clients.
oui mais comme ça, ça veut dire que si j'ajoute un IDClient via un autre formulaire, je serais obligé d'ajouter dans le code
<select name="bidule-id3" id="bidule-id3" class="liste-secondaire">
<option></option>
<option></option>
</select>


Il y aura autant de select que de client non?
Oui si tu choisis cette solution, je te l'accorde ça peut être lourd, sinon tu fais une requête ajax à chaque onchange qui te retourne un select de ton client via son id. Moins lourd en terme de page, plus "lourd" en terme de requêtes.
Oui en fait je suis un peu coincé, je ne sais pas si quelqu'un à déjà réalisé ce type de formulaire.

Si il y a d'autre option qui serais adapté en changeant de structure ou je ne sais pas !

Un peu perdu avec ce prob !!!
Tout dépend de ce que tu veux faire. Que veux tu mettre dans ta liste secondaire, qu'est ce qu'elle doit contenir? Pourquoi est-elle différente pour chaque client?
Tu as deux possibles solutions, ce sont les deux solutions que tu ne vois pas? Celle avec tous les select est "lourde", celle en ajax est un peu plus complexe cependant.
Et oui fort heureusement des gens ont déjà fait ce genre de formulaire Smiley smile
Ok donc pour répondre a ta question, j'ai deux tables liés :
table clients
table systemes qui contient mon IDClient.

sur mon formulaire (formulaire pour un support technique) l'utilisateur doit sélectionner sont nom de client (genre de filtre) lorsqu'il a choisi, ma liste 2 sélectionne le système qui est lié a ce client.

Donc je partirai sur l'ajax même si c'est complexe ! il faut automatiser le plus possible ce système.
Je vais essayer de trouver un tuto
Bonjour,
,
bon je viens de voir mon chef de projet, le système que je souhaitais réaliser ne peut pas s'adapter à notre projet.

Donc le problème a été retourné dans un autre sens, j'explique :
Avant cette page, j'ai une page de login, et je souhaiterais faire une page où le contenue change par rapport au login de connexion.

J'ai pas de code à vous donner, mais j'aimerais juste une piste, car je ne vois pas dans quel sens tourner le problème.

PS: pour l'autre problème de liste déroulante j'ai trouvé ce tuto en AJAX si ça peut aider :
ICI
Bon je viens de faire un premiers code qui........ne fonctionne pas !!!! (pour changer)

donc dans l'idée j'ai mon formulaire de connexion qui est lié à une table 'utilisateurs' dans celle-ci ce trouve 'IDClient' donc grâce au login je veux récupérer mon 'IDClient' pour l'utiliser dans une autre requête qui va me permettre d'afficher une liste déroulante on fonction de l'utilisateur.

C'est une table 'systemes' qui viendra intervenir dans cette requête où j'ai mon IDClient qui est présent.

Voici le code :
<?php
            if($_POST['login'] != '' and $_POST['password'] != '')
            {
                //je verifie que j'ai la paire login+mdp

                $sql ="SELECT * FROM utilisateurs";
                $res = $cnx->query($sql);
                $row = $res->fetch(PDO::FETCH_ASSOC);
                if (($row['Login'] == $_POST['login']) AND ($row['Password'] == $_POST['password']))
                {
                    $log  = mysql_real_escape_string(htmlspecialchars($_POST['login']));
                    $sql1 = $cnx->query('SELECT IDClient FROM utilisateurs WHERE Login ="'. addslashes($log) .'"') or die(mysql_error());
                    $row1 = $sql1->fetch(PDO::FETCH_ASSOC);
                    
                   //j'affiche le formulaire
                    ?>
                    <form action="process.php" method="post" name="form_ticket">
                        <fieldset><legend class="legende">Contacter le support</legend>
                            <label for="nom" class="libele">Nom</label>
                            <input type="text" name="nom" id="nom" size="30" /><br>
                            <label for="systeme" class="libele">Systèmes :</label>
                            <select name="systeme" id="systeme" size="1" /><br>
                                <option selected>Selectionner un système</option><?php
                                $sql = $cnx->query('SELECT * FROM systemes WHERE IDClient="'. addslashes($row1).'"') or die(mysql_error());
                                while ($row = $sql->fetch()) 
                                {?>
                                    <option value="<?php echo $row['IDSysteme']; ?>"><?php echo $row['Designation']; ?></option>
                               <?php } ?>
                            </select><br>
                        </fieldset>
                    </form>
                    <?php
                }else {
                    echo "Les informations sont incorrect ! <a href=\"index.php\">Retour</a>";
                }
            }else {
                echo "Tous les champs ne sont pas renseigné ! <a href=\"index.php\">Retour</a>";
            }
            ?>
en cherchant bien j’avais oublié addslashes($row1['IDClient'])
de :
<select name="systeme" id="systeme" size="1" /><br>
                                <option selected>Sélectionner un système</option><?php
                                $sql = $cnx->query('SELECT * FROM systemes WHERE IDClient="'. addslashes($row1['IDClient']).'"') or die(mysql_error());
                                while ($row = $sql->fetch()) 
                                {?>
                                    <option value="<?php echo $row['IDSysteme']; ?>"><?php echo $row['Designation']; ?></option>
                               <?php } ?>
                            </select><br>



Cependant, avec se code si je me log avec un autre login et pass, j'ai mon erreur les info sont incorrects, je ne rentre pas dans le if de vérification alors que le login et mdp sont les bon, testé avec d'autre paire mais rien ne change.

Pensez-vous que ça provient du fait que je ne fait pas de déconnexion de mon premier utilisateur de test?
Salut, un peu la flemme de lire tout mais je dirais que c'est de la chance si ça marche pour ton premier utilisateur. Ton code:

$sql ="SELECT * FROM utilisateurs";

Ton soucis vient de là. Cela fonctionne pour un utilisateur car cet utilisateur en question doit être le premier ressorti de ton select *. Bref, tu as oublié de mettre des conditions à ta requête pour sélectionner le login particulier.

 $sql ="SELECT IDClient, login, password FROM utilisateurs WHERE login='".$_POST['login']."';";

Tu vois? De plus, ça t'évite de refaire une requête en dessous.
Modifié par floreo (21 Jan 2014 - 20:04)
Bonjour,

Merci floreo pour tes conseils, mon code fonctionne correctement !

Encore un pas de plus vers le monde du php Smiley ravi
Aucun soucis, essaie cependant d'être plus rigoureux, n'hésite pas à écrire ce que doit faire ton script sur papier (chacune des étapes) puis tu l'implémentes, c'est préférable dans certains cas que de partir tête baissée dans le code. Smiley smile