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 :

Recherche multi critére


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Septembre 2021
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Enseignant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2021
    Messages : 2
    Par défaut Recherche multi critére
    Bonjour.

    Le but de l'application est de sélectionner une photo comportant une ou plusieurs personnes,
    Problème quand le sélectionne Pére et Mére "par exemple" je devrais avoir trois réponses mais je ne reçois rien car les autres variables sont vides,
    et quand mon SELECT regarde dans la table il est possible qu'il y ai une valeur.
    donc j'ai essayé de détruire les variables vides avant le SELECT mais je n'arrive pas à gérer le SELECT avec ses variables détruites.
    Auriez vous un conseil ou une idée pour mon problème.
    PS: j'ai utilisé UNSET pour détruire les variables vides mais je suis prêt à essayer tout autre procédure, n'étant pas très fort en php.
    merci d'avance.

    page1

    Code HTML : 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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    <!doctype html>
    <html>
    <head>
    <meta charset="utf-8">
    <title>FranceSelect</title>
    <link  rel="stylesheet" media="screen" type="text/css" title="Design" href="">
    </head>
    <body>
        <style>
        body { background-color: beige;  }
      </style>
    <header>
    </header>
     
    <form method="POST" action="cherchePhotos_1Essai.php">
    <table align="center">
     
        <tr>
            <td>
                <table border="1" align="center">
        <tr>
            <td align="center">Famille</td>
     
     
        </tr>
        <tr>
            <td>
                <input type="text" id="numero" name="numero" value=""/> 
                <label for="numero">Numéro</label> <br>
     
                <input type="checkbox" id="pere" name="pere" value="Pére"/> 
                <label for="pere">Pére</label> <br>
     
                <input type="checkbox" id="mére" name="mére" value="Mére"/> 
                <label for="mere">Mére</label> <br>
     
                <input type="checkbox" id="garcon" name="garcon" value="Garçon"/>
                <label for="garcon">Garçon</label>   <br>
     
                <input type="checkbox" id="fille" name="fille" value="Fille"/> 
                <label for="fille">Fille</label> <br>
     
                <input type="checkbox" id="bebe" name="bebe" value="Bébé"/> 
                <label for="bebe">Bébé</label> <br>
     
     
            </td>
        </tr>
    </table>
    <table align="center">
        <td align="center">
      <input type="submit" value="Envoyer" name="Envoyer" />
    </td>
    </table>
    </form>
     
    </body>
    </html>

    page2
    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    <?php
     
        if(isset($_POST['numero']))  $numero=$_POST['numero'];
        else $numero="";
     
        if(isset($_POST['pere']))  $pere=$_POST['pere'];
        else $pere="";
     
        if(isset($_POST['mere']))    $mere=$_POST['mere'];
        else $mere="";
     
        if(isset($_POST['garcon']))    $garcon=$_POST['garcon'];
        else $garcon="";
     
        if(isset($_POST['fille']))    $fille=$_POST['fille'];
        else $fille="";
     
        if(isset($_POST['bebe']))    $bebe=$_POST['bebe'];
        else $bebe="";
     
     
    $NbrImgParLigne = 6;
    $NumImgLigne = 0;
    ?>
     
    <?php
     
    try
        {
            $bdd = new PDO('mysql:host=localhost;dbname=photos2022;charset=utf8', 'root', '');
        }
    catch(Exception $e)
        {
            die('Erreur : '.$e->getMessage());
        }
     
        echo "<table border='1' width='100%'; ><tr align='center'>";
     
        $req = $bdd->prepare("SELECT * FROM photos2 WHERE numero = :numero AND pere = :pere AND mere = :mere AND garcon = :garcon AND fille= :fille AND bebe = :bebe ");
     
        $req->execute(array(
                'numero' =>$numero,
                'pere'   =>$pere,
                'mere'   =>$mere,
                'garcon' =>$garcon,
                'fille'  =>$fille,
                'bebe'   =>$bebe
     
            ));
     
     
        while ($row = $req->fetch())
        {
            $id = $row['id'];
     
            if ($NumImgLigne>=$NbrImgParLigne)
             {
                 echo "</tr><tr align='center'>";
                 $NumImgLigne = 0;
             }
     
             $NumImgLigne++;
     
            echo "<td text-align='center'>";
     
            echo "<td text-align='center'><a href='index.php?id=$id&amp'>
    /    ;<br/><img src='/Photos2022/photos/$id.jpg'width='50%' align='center'></a></td>";
     
            echo "</td>";
    }
        echo  "</tr></table>";
     
        ?>
        </div>
        <?php
     
        {
        $req->closeCursor();
        }
     
        ?>
    </body>
    </html>
    Nom : Capture d’écran 2022-05-26 192202.png
Affichages : 101
Taille : 92,7 Ko

    Merci pour vos réponses qui ont pour une très grosse partie répondu à mon problème.
    Mais il y a un souci qui est apparu:
    je suis obligé de supprimer la variable "numero'' qui m'empêche de recevoir les données du serveur.
    Avec la variable "numero" le SELECT ne me renvoi rien, en enlevant la variable "numero" le système fonctionne.
    Est-il possible que "inmput type text" bloque le SELECT.
    encore merci et bonne journée.

  2. #2
    Membre éprouvé Avatar de two3d
    Homme Profil pro
    Développeur Web
    Inscrit en
    Novembre 2012
    Messages
    126
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Tarn (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Novembre 2012
    Messages : 126
    Par défaut
    Regarde ce que contient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                'numero' =>$numero,
                'pere'   =>$pere,
                'mere'   =>$mere,
                'garcon' =>$garcon,
                'fille'  =>$fille,
                'bebe'   =>$bebe
    Pour être sûr de ce que ça recherche.

  3. #3
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 323
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 323
    Billets dans le blog
    17
    Par défaut
    Problème quand le sélectionne Pére et Mére "par exemple" je devrais avoir trois réponses mais je ne reçois rien car les autres variables sont vides
    Le problème avec ta requête est que lorsqu'une case n'est pas cochée tu demandes les lignes dont la colonne est vide, ce qui exclu=t donc les lignes dont les colonnes sont valorisées.

    Voilà ce que le serveur MySQL exécute dans ce cas :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT *
    FROM photos2
    WHERE numero = ''
        AND pere = 'Père'
        AND mere = 'Mère'
        AND garcon = ''
        AND fille = ''
        AND bebe = ''

    Et effectivement, aucune ligne ne correspond à ces critères.

    Revois ta requête en faisant :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM photos2
    WHERE TRUE
        AND numero <=> COALESCE(:numero, numero)
        AND pere <=> COALESCE(:pere, pere)
        AND mere <=> COALESCE(:mere, mere)
        AND garcon <=> COALESCE(:garcon, garcon)
        AND fille <=> COALESCE(:fille, fille)
        AND bebe <=> COALESCE(:bebe, bebe)

    Et fait en sorte que tes variables PHP soient null au lieu de chaîne vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(isset($_POST['numero']))  $numero=$_POST['numero'];
    else $numero="";
    À remplacer par :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if(isset($_POST['numero']))  $numero=$_POST['numero'];
    else $numero= null;
    Ou mieux :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $numero = $_POST['numero'] ?? null; // $numero vaut $_POST['numero'] si défini, sinon null
    Ainsi tu transmettras la variable si valorisée, sinon null.

    Au niveau du SQL, grâce au COALESCE() :
    Si tu reçois une valeur => Elle sera utilisée pour le filtre
    Si tu reçois NULL => La valeur de la colonne sera utilisée pour la comparaison, ce qui aura pour effet de "neutralyser" le filtre

    Dans ton cas ça donnerait en 1re étape :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM photos2
    WHERE TRUE
        AND numero <=> COALESCE(NULL, numero)
        AND pere <=> COALESCE('Père', pere)
        AND mere <=> COALESCE('Mère', mere)
        AND garcon <=> COALESCE(NULL, garcon)
        AND fille <=> COALESCE(NULL, fille)
        AND bebe <=> COALESCE(NULL, bebe)

    Et après exécution des COALESCE() :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT *
    FROM photos2
    WHERE TRUE
        AND numero <=> numero
        AND pere <=> 'Père'
        AND mere <=> 'Mère'
        AND garcon <=> garcon
        AND fille <=> fille
        AND bebe <=> bebe

    Ainsi seuls "Père" et "Mère" sont discriminants.

    L'opérateur <=> (comparaison NULL-safe) est identique à = si ce n'est qu'il permet d'obtenir un NULL <=> NULL évalué TRUE (au lieu de NULL avec =)

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

Discussions similaires

  1. [MySQL] Recherche multi-critères ou un seul
    Par jack1234 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/12/2005, 08h56
  2. Recherche multi-critères
    Par PAUL87 dans le forum Access
    Réponses: 66
    Dernier message: 13/12/2005, 12h12
  3. problème SQL avec le tutoriel recherche multi critère
    Par qbihlmaier dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 05/12/2005, 19h33
  4. problème avec résultat de recherche multi-critères
    Par audrey_desgres dans le forum Access
    Réponses: 2
    Dernier message: 23/06/2005, 11h00
  5. Procédure stockée: recherche multi-critères
    Par biroule dans le forum MS SQL Server
    Réponses: 11
    Dernier message: 01/09/2004, 16h02

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