Page 1 sur 1

Problème de liste déroulante dépendantes

Publié : 11 Jan 2017, 11:36
par batistaye
Bonjour, Je suis actuellement en train de refaire l'intranet d'un hôpital où je fais mon stage.
Malheureusement, j'ai un soucis au niveau des listes déroulantes dépendantes.
En effet, je n'arrive pas à les afficher, plus précisément, quand je clique sur la catégorie qui est censé faire apparaître la suivante, le champ se rafraîchit] tout seul et redemande la sélection de ma 1ere catégorie.
Voici le code que j'utilise ci-dessous :

Code : Tout sélectionner

<!Doctype html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Liens_utiles</title>
    </head>
    <body>
        <header>
            <?php
            include("../Header.php");
            ?>
        </header>
        <h3>Choix de la catégorie</h3>
        <?php
        $serveur = "localhost";
        $admin = "root";
        $mdp = "vmec";
        $base = "Liens_utiles";

        $idr = isset($_POST['categorie'])? $_POST['categorie']:null;
        ?>   
        <?php
        if (isset($_POST['ok']) && isset($_POST['contenu'])&& $_POST['contenu'] != "") {
            $categorie_selectionnee = $_POST['categorie'];
            $contenu_selectionne = $_POST['contenu'];
            ?>
            <p>Vous avez sélectionné le contenu <?php echo($contenu_selectionne); ?> dans la catégorie <?php echo($categorie_selectionnee); ?></p>
            <?php
        }
        ?>
        <h3>Trouver un contenu</h3>
        <?php
        /* On établit la connexion à MySQL avec mysql_pconnect() plutôt qu'avec mysql_connect()
         *  car on aura besoin de la connexion un peu plus loin dans le script */
        $connexion = new mysqli($serveur, $admin, $mdp);


        if ($connexion != false) {

            $choixbase = mysqli_select_db($connexion, $base);
            $sql1 = "SELECT `id_categorie`, `categorie` FROM `Categorie_site` ORDER BY `id_categorie`";
            $rech_categorie = $connexion->query($sql1);
            $code_categorie = array();
            $categorie = array();
            /* On active un compteur pour les régions */
            $nb_categorie = 0;

            if ($rech_categorie != false) {
                while ($ligne = mysqli_fetch_assoc($rech_categorie)) {
                    array_push($code_categorie, $ligne['id_categorie']);
                    array_push($categorie, $ligne['categorie']);

                    /* On incrémente de compteur */
                    $nb_categorie++;
                }
            }
            ?>
            <form action="<?php echo($_SERVER['PHP_SELF']); ?>" method="POST" name="chgcontenu">
                <fieldset>
                    <legend>Sélectionnez une catégorie</legend>
                    <select name="catégorie" id="catégorie" onchange="document.forms['chgcontenu'].submit();">
                        <option value="-1">- - - Choisissez une catégorie - - -</option>
                        <?php
                        for ($i = 0; $i < $nb_categorie; $i++) {
                            ?>
                            <option value="<?php echo($code_categorie[$i]); ?>" <?php echo((isset($idr)&& $idr == $code_categorie[$i])?"selected=\"selected\"":null); ?>><?php echo($categorie[$i]); ?></option>
                            <?php
                        }
                        ?>
                    </select>
                    <?php
                    mysqli_free_result($rech_categorie);
                    /* On commence par vérifier si on a envoyé un numéro de région et le cas échéant s'il est différent de -1 */

                    if (isset($idr) && $idr != -1){
                        /* Cération de la requête pour avoir les départements de cette région */
                        $sql2 = "SELECT `id_contenu`, `contenu` FROM `Contenu_site` WHERE `id_categorie` = " . $idr . " ORDER BY `id_contenu`;";
                        if ($connexion != false) {
                            $rech_contenu = $connexion->query($sql2);
                            /* Un petit compteur pour les départements */
                            $nd = 0;
                            /* On crée deux tableaux pour les numéros et les noms des départements */
                            $code_contenu = array();
                            $nom_contenu = array();
                            /* On va mettre les numéros et noms des départements dans les deux tableaux */
                            while ($ligne_contenu = mysqli_fetch_assoc($rech_contenu)) {
                                array_push($code_contenu, $ligne_contenu['id_contenu']);
                                array_push($nom_contenu, $ligne_contenu['contenu']);
                                $nd++;
                            }
                            /* Maintenant on peut construire la liste déroulante */
                            ?>
                            <select name="contenu" id="contenu">
                                <?php
                                for ($d = 0; $d < $nd; $d++) {
                                    ?>
                                    <option value="<?php echo($code_contenu[$d]); ?>"<?php echo((isset($contenu_selectionne) && $contenu_selectionne == $code_contenu[$d]) ? " selected=\"selected\"" : null); ?>><?php echo($nom_contenu[$d] . " (" . $code_contenu[$d] . ")"); ?></option>
                                    <?php
                                }
                                ?>
                            </select>
                            <?php
                        }
                        /* Un petit coup de balai */
                        mysqli_free_result($rech_contenu);
                    }
                    ?>
                    <br /><input type="submit" name="ok" id="ok" value="Envoyer" />
                </fieldset>
            </form>
            <?php
            /* Terminé, on ferme la connexion */
            mysqli_close($connexion);
        } else {
            /* Si on arrive là, c'est pas bon signe, il faut vérifier les
             * paramètres de connexion, mot de passe, serveur pas démarré etc... */
            ?>
            <p>Un incident s'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement.</p>
            <?php
        }
        ?>

    </body>
</html>


Pouvez vous m'aider :/ ? ou avez vous une autre solution pour créer des listes déroulantes dépendantes ?

Re: Problème de liste déroulante dépendantes

Publié : 11 Jan 2017, 16:32
par moogli
salut,

on a un beau tuto sur le sujet :mrgreen: => faq-tutoriels/listes-liees-avec-html-javascript-t255580.html

si le fond de ton code
- Sépare la connexion sql dans un autre fichier que tu pourras inclure au besoin (parce que la sinon tu déclares la chose sur tout les fichiers, bonjour le merdier pour changer d'environnement, genre passage en prod).
- Si tu refait utilise PDO plutôt que mysql c'est plus sympa à l'utilisation (par exemple pour les requête préparée avec marqueurs nommés)
- utilise plutôt un foreach qu'une boucle for pour parcourir un tableau
- évite d'utiliser des accents, et plus généralement des caractères spécifique : categorie plutôt que catégorie (même si c'est pas français, utilise l'anglais si tu préfère => category).
- les `ne sont utiles que si tu utilise des mots clefs réserver SQL (ou mysql).
- tu n'as pas besoin de () avec echo
- tu n'as pas besoin de tableau intermédiaire pour stocker les données et les afficher ensuite, c'est une source d'erreur, c'est plus long, moins compréhensible etc.
- essai d'éviter le mélange php / html (avec fermeture / ouverture de tag) c'est âs simple à suivre et tu gagnes pas grand chose (voir rien) à le faire.

ton code éclairci et syntaxiquement correcte
<?php
// connexion à externalisé, utilisation de PDO pour l'exemple et la belle requête préparée plus bas (qui t'évite une injection SQL au passage)
$serveur = "localhost";
$user = "root";
$mdp = "vmec";
$base = "Liens_utiles";
$options = [PDO::MYSQL_ATTR_INIT_COMMAND => 'SET NAMES utf8',
PDO::ATTR_ERRMODE=> PDO::ERRMODE_EXCEPTION,
PDO::ATTR_EMULATE_PREPARES => false];
$connexion = new PDO('mysql:host='.$serveur.';dbname='.$base,$user,$mdp,$options);
if ($connexion === false) {
$msgCnxSQL = 'Un incident s\'est produit lors de la connexion à la base de données, veuillez essayer à nouveau ultérieurement';
}
?>
<!Doctype html>
<html>

<head>
<meta charset="utf-8">
<title>Liens_utiles</title>
</head>

<body>
<?php
// si le message existe c'est qu'il y a un gros soucis. on l'affiche et on arrete le script (mais un doc html correct et propre).
if(!empty($msgCnxSQL)){
echo <<<html
<div class="erreur">{$msgCnxSQL}</div>
</body>
</html>
html;
die(666);
}
?>
<header>
<?php
include("../Header.php");
?>
</header>
<h3>Choix de la catégorie</h3>
<?php
if (isset($_POST['ok']) && isset($_POST['contenu'])&& $_POST['contenu'] != "") {
echo <<<html
<p>Vous avez sélectionné le contenu {$_POST['categorie']} dans la catégorie {$_POST['contenu']}
</p>
html;
}
?>
<h3>Trouver un contenu</h3>
<form method="post" name="chgcontenu">
<fieldset>
<legend>Sélectionnez une catégorie</legend>
<select name="categorie" id="catégorie" onchange="document.forms['chgcontenu'].submit();">
<option value="">- - - Choisissez une catégorie - - -</option>
<?php
$rech_categorie = $connexion->query('SELECT id_categorie, categorie FROM Categorie_site ORDER BY id_categorie');
if ($rech_categorie !== false) {
while ($data = $rech_categorie->fetch(PDO::FETCH_ASSOC)) {
echo '<option value="',$data['id_categorie'],'"';
if(!empty($_POST['categorie']) && $_POST['categorie'] == $data['id_categorie']){
echo ' selected="selected"';
}
echo '>',$data['categorie'],'</option>';
}
$rech_categorie->closeCursor();
}
echo '</select><br />';
if (!empty($_POST['categorie'])){
/* Cération de la requête pour avoir les départements de cette région */
$stmt = $connexion->prepare('SELECT id_contenu, contenu FROM Contenu_site WHERE id_categorie = :id ORDER BY id_contenu');
$stmt->bindParam(':id',$_POST['categorie']);
$stmt->execute();
echo '<select name="contenu" id="contenu">';
while($data = $stmt->fetch(PDO::FETCH_ASSOC)){
echo '<option value="',$data['id_contenu'],'"';
if(!empty($_POST['contenu']) && $_POST['contenu'] == $data['id_contenu']){
echo ' selected="selected"';
}
echo '>',$data['contenu'],'(',$data['id_contenu'],')</option>';
}
$stmt->closeCursor();
echo '</select>';
}
?>
<br />
<input type="submit" name="ok" id="ok" value="Envoyer" />
</fieldset>
</form>
</body>

</html>



@+

Re: Problème de liste déroulante dépendantes

Publié : 12 Jan 2017, 10:06
par batistaye
Merci beaucoup, ca marche du coup ;) Bonne journée !