IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Listes liées : 2ème liste vide pour une seule valeur sélectionnée dans la première liste [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut Listes liées : 2ème liste vide pour une seule valeur sélectionnée dans la première liste
    Bonjour à tous,

    Voici une énième question au sujet de listes liées, mais à laquelle je n'ai pas trouvé de réponse.

    J'ai construit deux listes liées (PHP, MYSQL, AJAX) à partir de 2 tables :
    Liste1 à partir de la TABLE1 contenant 2 champs : id1 (clé primaire) et lbl1
    Liste2 à partir de la TABLE2 avec 3 champs : id2 (clé primaire) ref_id1 (clé de TABLE1) et lbl2
    Liste2 est fonction de la valeur id1 sélectionnée dans Liste1

    Tout fonctionne au poil, sauf si je sélectionne dans liste1 l'id1 du premier enregistrement de TABLE1 (soit id1=0). Dans ce cas uniquement, la liste2 est vide (alors qu'elle devrait me sortir 8 lignes).
    Pour tout autre choix, la liste2 s'affiche correctement.
    Comprend pas...

    Si quelqu'un pouvait m'aider à comprendre, et à fixer le problème

    pour info, les extraits de code concernés :

    listes.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    <!DOCTYPE html>
    <html>
    ...
    <body>
    ...
    <?php
        $query = "SELECT * FROM TABLE1 ORDER BY lbl1 ASC";
        $res = mysqli_query ($db, $query);
        $rowCount = mysqli_num_rows ($res);    
    ?>
     
    <select id="liste1">
        <option value="">selectionner le lbl1</option>
        <?php
        if($rowCount > 0)
            {
            while($row = mysqli_fetch_assoc ($res))
                { 
                echo '<option value="'.$row['id1'].'">'.$row['lbl1'].'</option>';
                }
            }
        else
            {
            echo '<option value="">pas de lbl1 disponible</option>';
            }
        ?>
    </select>
     
    <select id="liste2">
        <option value="">selectionner un lbl1 ci-dessus</option>
    </select>
    ...
    </body>
    </html>
    ajaxlistes.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
     
    <?php
    ...
    if(!empty($_POST["id1"]))
        {
        $query = "SELECT * FROM TABLE2 WHERE ref_id1 = ".$_POST['id1']." ORDER BY lbl2 ASC";
        $res = mysqli_query ($db, $query);
        $rowCount2 = mysqli_num_rows ($res);
        if($rowCount2 > 0)
            {
            echo '<option value="">Selectionner le lbl2 </option>';
            while($row = mysqli_fetch_assoc ($res))
                { 
                echo '<option value="'.$row['id2'].'">'.$row['lbl2'].'</option>';
                }
            }
        else
            {
            echo '<option value="">Pas de lbl2 disponible</option>';
            }
        }
    ...
    ?>
    Je peux aussi fournir le javascript si ça peut être utile.

  2. #2
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tes 2 scripts PHP ont l'air cohérents, donc je suppose que le problème vient de l'appel ajax au 2e script lors de la modification de la valeur de la 1ere liste.
    Peut-on voir le JS ?

  3. #3
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci Celira pour ta réponse rapide.
    liste1vers2.js :
    Code javascript : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    $(document).ready(function()
        {
        $('#liste1').on('change',function lbl1handle()
            {
            var lbl1ID = $(this).val();
            if(lbl1ID)
                {
                $.ajax(
                    {
                    type:'POST',
                    url:'ajaxlistes.php',
                    data:'id1='+lbl1ID,
                    success:function(html)
                        {
                        $('#liste2').html(html);
                        ...
                        }
                    }); 
                }
            else
                {
                $('#liste2').html('<option value="">Selectionner le lbl1 ci-dessus</option>');
                ...
                }
            });
        });

  4. #4
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 461
    Points : 4 998
    Points
    4 998
    Par défaut
    Salut,
    Citation Envoyé par ClayStone
    sauf si je sélectionne dans liste1 l'id1 du premier enregistrement de TABLE1 (soit id1=0). Dans ce cas uniquement, la liste2 est vide
    Est ce qu'il y a des lignes avec ref_id1=0 dans la table2 ?

  5. #5
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Dans ton javascript, tu as ceci :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var lbl1ID = $(this).val();
    if(lbl1ID)
    Javascript fait une conversion automatique de la valeur en booléen pour le test. Or 0 est considéré comme équivalent au booléen false. Essaye avec :
    Code JS : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var lbl1ID = $(this).val();
    if(lbl1ID != "")

  6. #6
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    @ Toufik83 Merci pour la piste, mais...
    Est ce qu'il y a des lignes avec ref_id1=0 dans la table2 ?
    Oui, il y en a 8, et la requête dans phpmyadmin me renvoie bien les 8 lignes correctement. Et s'il n'y en avait pas, est-ce que la liste2 n'afficherait pas : "Pas de lbl2 disponible" au lieu d'être vide ?

    @Celira
    1-
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var lbl1ID = $(this).val();
    if(lbl1ID != "")
    Pas de changement, id° avec des simples guillemets, id° avec un espace : une liste vide (mais une liste quand-même)

    Mais
    2- donne en liste2 : "Selectionner le lbl1 ci-dessus"

    Je dis peut-être une bêtise mais, avec 1- le test semble réussi puisqu'il me donne une liste (vide), et échoué avec 2- (pas de liste du tout)?

  7. #7
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 461
    Points : 4 998
    Points
    4 998
    Par défaut
    Et s'il n'y en avait pas est-ce que la liste2 s'afficherait pas : "Pas de lbl2 disponible" au lieu d'être vide ?
    Si la liste2 est totalement vide, ça veux dire que le fichier php ne renvoie rien, vu que tu as mis
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if(!empty($_POST['id1']))
    , essaie de modifier cette condition comme suite
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if(is_int((int)$_POST['id1']))
    et dans la value de la première option de la liste1, tu mets value="0" au lieu de value="" pour tester.

  8. #8
    Expert éminent sénior
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Points : 16 545
    Points
    16 545
    Billets dans le blog
    12
    Par défaut
    Salut,

    @Toufik83
    Ton test renverra toujours vrai : regarde
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $x = is_int((int)""); // true
    $y = is_int((int)"abc"); // true
    $z = is_int((int)$v); // true avec warning

  9. #9
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Re,
    @Toufik83
    ta solution renvoie une 2eme liste valide pour ref_id1=0 mais fait échouer la récupération d'autres données plus loin dans le script (échec pour tous les ref_id1 alors que jusque là, je n'avais un échec qu'avec ref_id1=0 )

    @rawsrc je n'ai pas tout compris à ta remarque, elle explique peut-être l’échec de la suggestion de Toufik83?

  10. #10
    Expert confirmé Avatar de Toufik83
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Janvier 2012
    Messages
    2 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2012
    Messages : 2 461
    Points : 4 998
    Points
    4 998
    Par défaut
    oui @rawsrc je sais, mais c'est le seul moyen qui a fonctionné pour moi, avec un id=0 et aussi 1,2,3....
    Je récupéré bien les options dans la liste2.

  11. #11
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    J'ai contourné le problème en remplaçant dans ma base de donnée tous les enregistrements de clés ayant pour valeur 0 avec quelques UPDATE (et leurs WHERE qui vont bien).
    Et tout baigne.
    Mais c'est très bourrin non?

    Je suis donc toujours preneur de suggestions sur la question , et j'attends donc un peu avant de marquer la discussion comme résolue.

    En tout cas, merci de vous être penchés sur mon cas

  12. #12
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Il y a le même problème dans le PHP que dans le JD : if(!empty($_POST["id1"])). empty considère également que "0" est vide
    Essaye avec isset() : if(isset($_POST["id1"]))Et au passage, tu as une montreuse faille d'injection SQL, puisque tu colles directement la valeur de $_POST["id1"] dans ta requête. Utilise au moins mysqli_real_escape_string() pour échapper la valeur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $query = "SELECT * FROM TABLE2 WHERE ref_id1 = ".mysqli_real_escape_string($db, $_POST['id1'])." ORDER BY lbl2 ASC";

  13. #13
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    Merci Celira, je regarde ce sacré '0' et je reviens, pas ce soir.

    Concernant le mysql et le php, je débute et je suis super-fier quand une requête me donne le résultat que je lui demande, ou que j'arrive à m'inspirer d'un script pour en créer un autre qui est fonctionnel, alors la sécurité... je n'y connais rien .
    Aurais-tu un/des liens référence la-dessus, au moins pour les grands principes ? je n'ai pas repéré grand-chose dans les cours mysql ici-même.

  14. #14
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu peux lire 10 principales failles de sécurité des applications Web et la doc de PHP sur les Injections SQL pour plus de détails.

    En résumé : le principe de base est "Never Trust User Input" (ne jamais faire confiance aux données envoyées par l'utilisateur, mais ça claque mieux en anglais )
    Donc, si ça arrive de l'extérieur du script (par exemple d'un formulaire), on contrôle et on échappe.

    Par exemple, ici tu fais une recherche sur un id, qui je suppose est un nombre. Tu peux donc ajouter un contrôle en début de script pour vérifier que la donnée reçue est bien numérique avant de l'utiliser. SI ce n'est pas le cas, c'est que quelque chose cloche, donc on ne fait pas la recherche en base.

  15. #15
    Membre du Club
    Homme Profil pro
    autodidacte / éternel débutant
    Inscrit en
    Avril 2018
    Messages
    64
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Corrèze (Limousin)

    Informations professionnelles :
    Activité : autodidacte / éternel débutant

    Informations forums :
    Inscription : Avril 2018
    Messages : 64
    Points : 43
    Points
    43
    Par défaut
    @Celira, Nickel !!
    avec (post #5) :
    Code js : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    var lbl1ID = $(this).val();
    if(lbl1ID != "")
    et (post #12) :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    if(isset($_POST["id1"]))
    C'est résolu, et en plus j'ai compris pourquoi grâce à tes explications

    Et merci pour la doc, abordable même pour moi, et ça parait essentiel, surtout pour quelqu'un qui apprend sur le tas. Quand je pense que je serais passé à cote de ça... j'en frissonne.
    Mais du coup, j'ai du boulot !

    Un grand

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Deux Activity pour une seule valeur
    Par Davesique dans le forum Android
    Réponses: 1
    Dernier message: 23/06/2013, 00h51
  2. Réponses: 3
    Dernier message: 17/11/2008, 00h08
  3. Réponses: 2
    Dernier message: 11/11/2008, 01h44
  4. Réponses: 0
    Dernier message: 08/11/2008, 18h19
  5. Réponses: 13
    Dernier message: 30/06/2008, 16h25

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo