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

Langage PHP Discussion :

Ressources formulaire de recherche multi-critères [PHP 5.6]


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut Ressources formulaire de recherche multi-critères
    Bonjour,

    Je cherche des ressources pour créer un formulaire de recherche multicritères.
    J'ai réussi à développer un formulaire (de saisie/lecture, modification et suppression CRUD) de Contact basique en utilisant la POO class Contact + Class ContactManager...

    Ma table Contact contient les tuples suivants (par exemple):
    • - id = interger
    • - nom = string
    • - categorie = string
    • - sexe = bouton radio (masculin ou féminin)
    • - couleur = case à cocher multiple (bleu et/ou blanc et/ou rouge et/ou noir...)
    • - ville = liste déroulante
    • - ancienneté = interger


    En fonction des critères choisis par l'utilisateur interrogeant ma base de données (mysql), le résultat s'afficherait sous forme de tableau

    Par exemple : les critères choisis par l'utilisateur
    • nom : mysql commencerait à proposer les noms correspondants (autosuggestion) fulltext je crois
    • catégorie : entre 2001 ET 2003 (choix d'un intervalle)
    • sexe : féminin
    • couleur : noir et blanc (de coché)
    • ville : Paris
    • ancienneté : 8 (ans)


    je cherche :
    • - un livre
    • - une vidéo
    • - un tuto
    • - un exemple concret fonctionnel idéalement
    • - des codes
    • - autre



    pouvant m'aider à comprendre et à maîtriser les bonnes pratiques.

    Même si j'ai déjà bien avancé dans mon petit projet, je reste novice dans la programmation.

    Merci pour vos retours

  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
    Je n'ai pas ressource complète sous la main, mais quelques tutos utiles pour les différents éléments :

    Pour les affichages de données en tableau, tu as le tuto de jreaux Affichage de données dans un tableau HTML
    Pour la construction du formulaire, tu as le bon vieux tuto Les formulaires et PHP5 mais aussi des choses du côté du HTML comme Créez des formulaires fabuleux avec HTML5 (attention toutefois au support par les différents navigateurs. Tu peux regarder ce site pour savoir qui supporte quoi : https://html5test.com/)
    Et évidemment, l'interrogation à la base de données : Comprendre PDO

    Sinon, personellement, pour construire une requête dynamique à partir d'un formulaire, je fais quelque chose comme ça (attention, code non testé):
    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
    // on init la base fixe de la requête avec les champs à récupérer 
    $sql_select = "SELECT col_text, col_enum, col_date FROM la_table ";
     
    $criteres = [];
    $params = [];
     
    if (!empty($_POST['col_text'])) {
        // on crée un critère sur la colonne texte
        $criteres[] = " col_text = :col_text ";
        $params[':col_text'] = $_POST['col_text'];
    }
     
    if (!empty($_POST['col_enum'])) {
        // col_enum est un tableau, on veut qu'une des couleurs cochées correspondent, on utilise une condition IN avec un paramètre par col_enum
        $subCriteresEnum = [];
        $i = 0;
        foreach($_POST['col_enum'] as $coul) {
            $nomparam = ':col_enum_'.$i;
            $subCriteresEnum[] = $nomparam;
            $params[$nomparam] = $coul;
            $i++;
        }
        $criteres[] = " col_enum IN (".implode(' , ', $subCriteresEnum).") ";
    }
     
    // on concatène les critères pour construire la requête
    $sql_where = '';
    if (!empty($criteres)) {
        $sql_where .= ' WHERE '.implode(' AND ', $criteres);
    }
    $stmt = $pdo->prepare($sql_select.$sql_where);
    $stmt->execute($params);
    Pour explication : j'ai une partie fixe dans la requête qui définit le select avec la liste des champs à remonter. Tu peux avoir plusieurs parties fixes, par exemple, un select avec la liste des champs et un select count pour compter le nombre de résultats et mutualiser la partie where dynamique.
    Ensuite je construis des bouts de condition en fonction des champs du formulaire en stockant dans un tableau chaque condition et dans un autre tableau les paramètres correspondants nécessaires pour l'exécution de la requête (car bien sûr on utilise une requête préparée)
    Enfin, je concatène tous les morceaux de condition (avec des AND ou des OR en fonction de ce qu'on veut obtenir) et je prépare et j'exécute la requête avec les paramètres.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Merci CElira,

    vous êtes super

    je vais me mettre au travail pour essayer de comprendre

    je me permettrai de revenir vers vous si nécessaire car je pars dans l'inconnu

  4. #4
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Bonsoir Célira,

    j'ai beaucoup travaillé pour comprendre. Je pense avoir avancé mais il y a encore des notions qui m'échappent et m'empêchent de finaliser mon formulaire de recherche multicritères.

    Voilà où j'en suis :

    Bdd : test
    table : joueur
    champs :
    - id
    - nom
    - sexe
    - secteur
    - cd
    - categorie
    - taille

    J'ai réussi via un formulaire Création d'un contact à renseigner ma base de données
    Class Contact
    ContactManager (CRUD). Tout semble très bien fonctionner.


    Par la suite, j'ai créé un nouveau formulaire de recherche multicritères.

    1er pb :

    Dans mon formulaire Création d'un contact, l'utilisateur doit déterminer de quel département le contact est issu via un menu déroulant (1 donnée)

    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
     
    <?php
    ...
    <p>
    <label for="cd">DEPARTEMENT</label>
    <select name="cd" id="cd" required="">
    <option value=""> </option>	
    <option value="0A">0A</option>
    <option value="06">06</option>
    <option value="13">13</option>
    <option value="83">83</option>
    <option value="84">84</option>
    </select>
    </p>
    ...
    ?>
    En revanche, dans mon formulaire de recherche, l'utilisateur pourra choisir de trouver les contacts issus de plusieurs départements (via checkbox) mais je ne suis pas sur de bien faire correspondre les champs (je ne sais pas si je suis clair)
    J'ai un doute sur le name ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    <?php
    ...
    <p>
    <p><label for="cd">CD 0A</label><input type="checkbox" name="cd" id="cd" value="0A" /></p>
    <p><label for="cd">CD 06</label><input type="checkbox" name="cd" id="cd" value="06" /></p>
    <p><label for="cd">CD 13</label><input type="checkbox" name="cd" id="cd" value="13" /></p> 
    <p><label for="cd">CD 83</label><input type="checkbox" name="cd" id="cd" value="83" /></p> 
    <p><label for="cd">CD 84</label><input type="checkbox" name="cd" id="cd" value="84" /></p>
    </p>
    ...
    ?>

    De même, l'utilisateur devra rentrer une seule information pour la catégorie (année) du contact dans le formulaire de Création d'un contact. Mais dans le formulaire de recherche, l'utilisateur pourra à partir du champ catégorie rechercher les contacts entre 2 années, exemple de recherche :
    Contact => Categorie entre : ($_POST['x']) ET ($_POST['y'])

    Enfin, un champ de recherche basé sur la taille, par exemple
    Contact => Taille >= 189 (cm).

    je vous soumets modestement mon petit formulaire de recherche multicritères qui me permet de faire toutes mes expérimentations:

    form_recherche_multi.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
    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
     
    <!DOCTYPE html>
    <html>
    <head>
    	<title> FORMULAIRE DE RECHERCHE MULTICRITERES </title>
    	<meta charset="utf-8">
    	<link rel="stylesheet" type="text/css" href="stylemulti.css">
    </head>
     
     
    <body>
     
    	<div class="bloc1">
     
    		<form action="recherche_multi.php" method="post">
     
     
    			<div id="bloc2" class="bloc21">
    				<h1> RECHERCHE MULTICRITERES </h1>
    			</div>			
     
     
    			<div id="bloc2" class="bloc22">
     
    					<p> <label for="nom"> NOM : </label> <input type="text" name="nom" id="nom" placeholder="MAJUSCULE"/></p>
     
     
    					<p>
    						<p><label for="H"> HOMME : </label> <input type="radio" name="sexe" value="H" id="H"/></p>
    						<p><label for="F"> FEMME : </label> <input type="radio" name="sexe" value="F" id="F"/></p> 
    					</p>
     
     
    					<p>
    				       <label for="secteur">SECTEUR</label>
    				       <select name="secteur" id="secteur" >
    					       	<option value=""> </option>	
    					       	<option value="provence">PROVENCE</option>
    					        <option value="ca">COTE AZUR</option>
    				        </select>
    				   </p>
     
     
    				     <p>
    				       <p><label for="cd">CD 0A</label><input type="checkbox" name="cd" id="cd" value="0A" /></p>
    				       <p><label for="cd">CD 06</label><input type="checkbox" name="cd" id="cd" value="06" /></p>
    				       <p><label for="cd">CD 13</label><input type="checkbox" name="cd" id="cd" value="13" /></p> 
    				       <p><label for="cd">CD 83</label><input type="checkbox" name="cd" id="cd" value="83" /></p> 
    				       <p><label for="cd">CD 84</label><input type="checkbox" name="cd" id="cd" value="84" /></p>
    		   			</p>
     
     
    					<div class="bloc221">
    						<p><label for="categorie">CATEGORIE : </label><input type="text" name="categorie" id="categorie"/></p>
    						<p><label for="categorie2"> A  </label><input type="text" name="categorie2" id="categorie2"/></p>
    					</div>
     
     
    					<p> <label for="taille"> TAILLE SUPERIEURE A : </label><input type="text" name="taille" id="taille"/></p>
     
    			</div>
     
     
    			<div id="bloc2" class="bloc23">
    					<p><input type="submit" name="envoyer" value="RECHERCHER"/>
    					<input type="reset" name="effacer" value="RESET"/></p>
    			</div>	
     
     
    		</form>	
     
    	</div>
     
    </body>
     
    </html>
    et le code CSS

    stylemulti.css

    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
     
    body {
    	display: flex; 
    	justify-content: center; 
    	height: 98vh;
    	align-items: center;
     
    }
     
     
    .bloc1 {
    	display: flex;
    	background-color: #35597A;
    	border: 1px solid black; 
    	text-align: center; 
    }
     
     
    #bloc2 {
    	display: flex;
    	flex-direction: column;
    	padding:1px;
    	margin: 20px;
    	border: 1px solid black;
    }
     
     
    .bloc23 > p > input {
    	background-color: white; 
    	margin-left: 10px; 
    	margin-right: 10px; 
    	font-size: 10px; 
    	padding: 10px; 
    }
     
    .bloc221 {
    	display: flex;
     
    }
     
    .bloc221 > p > input {
    	width: 50px;
    	margin-left: 70px;
    	margin-right: 50px; 
     
     
    }
     
    input, select {
    	float:right;
    }
     
    label {
    	float: left;
    	font-weight: bold;
    	font-size: 20px; 
     
     
    }
    J'ai tenté beaucoup de choses mais cela dépasse largement mes compétences. je vous soumets ma fonction search que j'ai incluse dans mon fichier ContactManager.php qui me permet modestement de trouver tous les noms de ma base de données correspondants et de les afficher

    ContactManager.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
     
    public function search(contact $contact)
      {
     
     
            // on stocke dans la variable OBjet  $pdostatement la connexion + la requete préparée
           $this->pdoStatement = $this->pdo->prepare('SELECT * FROM joueur WHERE nom = :nom');
     
     
            // on lie les variables  
           $this->pdoStatement->bindValue(':nom', $_POST['nom'], PDO::PARAM_STR);
     
     
          $executeIsOK = $this->pdoStatement->execute();  
     
     
     
          //faire une boucle 
     
          $contacts = [];
     
          while ($contact = $this->pdoStatement->fetchObject('Contact'))      // ou bien essayer fetchAll((PDO::FETCH_ASSOC));
            { 
            $contacts [] = $contact; // tableau des contacts renseignés par la variable $contact (les contacts trouvés)
            }
          return $contacts; 
      }
    et enfin mon fichier recherche_multi.php qui traite les infos.

    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
    84
    85
    86
    87
    88
    89
     
    <?php
     
    require_once 'Contact.php';
    require_once 'ContactManager.php';
     
     
     
    $contact = new Contact();
     
     
    $contact->setNom($_POST['nom']);
    /*
    ->setSexe($_POST['sexe'])
    		->setSecteur($_POST['secteur'])
    		->setCd($_POST['cd'])
    		->setCategorie($_POST['categorie'])
    		->setTaille($_POST['taille'])*/		
     
     
    print_r('saisie des données');
    var_dump($contact);
     
     
    $contactManager = new ContactManager();		 
     
    $contacts = $contactManager->search($contact);
     
     
    print_r('retour de la requete');
    var_dump($contacts);
     
     
     
    ?>
     
    <!DOCTYPE html>
     
    <html lang='fr'>
     
     
    	<head>
    		<meta charset="utf-8">
    		<title> LISTE DE TOUS LES CONTACTS </title>
    	</head>
     
     
    	<body>
     
     
    		<h1> RESULTAT DE LA RECHERCHE MULTICRITERES </h1>
     
    			<?php if (empty($contacts)): ?>
     
    					<p> Il n'y a aucun contact à afficher </p> 
     
     
    				<?php else: ?>
     
    						<?php if($contacts === false): ?>
     
    							<p> Une erreur est survenue </p>
     
     
    						<?php else: ?>
     
    								<ul>
     
    									<?php foreach ($contacts as $contact): ?>
     
    										<li>                                                                                                                   
    											<?= $contact->getNom() ?> -  <?= $contact->getSexe() ?> -  <?= $contact->getSecteur() ?> -  <?= $contact->getCd() ?> -  <?= $contact->getCategorie() ?> -  <?= $contact->getTaille() ?><a href="form_update_contact.php?id=<?= $contact->getId() ?>"> MODIFIER </a>  
    										</li>	
     
    									<?php endforeach; ?>
     
    								</ul>
     
    						<?php endif; ?>		
     
    				<?php endif; ?>		
     
     
     
     
     
    	</body>
     
    </html>

    j'ai tenté de comprendre et d'utiliser votre code mais bien sur sans succès.

    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
     
    // on init la base fixe de la requête avec les champs à récupérer 
    $sql_select = "SELECT nom, sexe, secteur, cd, categorie, taille FROM joueur ";
     
    $criteres = [];
    $params = [];
     
    if (!empty($_POST['nom'])) {
        // on crée un critère sur la colonne texte
        $criteres[] = " nom= :nom";
        $params[':nom'] = $_POST['nom'];
    }
     
    if (!empty($_POST['sexe'])) {
        // on crée un critère sur la colonne texte
        $criteres[] = " sexe= :sexe";
        $params[':sexe'] = $_POST['sexe'];
    }
     
    if (!empty($_POST['secteur'])) {
        // on crée un critère sur la colonne texte
        $criteres[] = " secteur= :secteur";
        $params[':secteur'] = $_POST['secteur'];
    }
     
    if (!empty($_POST['cd'])) {
        // cd est un tableau, on veut qu'une des couleurs cochées correspondent, on utilise une condition IN avec un paramètre par cd
        $subCriteresEnum = [];
        $i = 0;
        foreach($_POST['cd'] as $comite) {
            $nomparam = ':cd_'.$i;
            $subCriteresEnum[] = $nomparam;
            $params[$nomparam] = $comite;
            $i++;
        }
     
    // possibilité de rechercher les contacts entre 2 catégories (entre 2001 et 2008) = trouve tous les contacts)   --  REQUETE SQL ?
     
    if (!empty($_POST['categorie'])) {
        // on crée un critère sur la colonne texte
        $criteres[] = " categorie= :categorie";
        $params[':categorie'] = $_POST['categorie'];
    }
     
     
    // possibilité de rechercher les contacts dont la taille dépasse (195 cm par exempl = trouve tous les contacts)  --  REQUETE SQL ?
     
    if (!empty($_POST['taille'])) {
        // on crée un critère sur la colonne texte
        $criteres[] = " taille= :taille";
        $params[':taille'] = $_POST['taille'];
    }
     
     
        $criteres[] = " col_enum IN (".implode(' , ', $subCriteresEnum).") ";
    }
     
    // on concatène les critères pour construire la requête
    $sql_where = '';
    if (!empty($criteres)) {
        $sql_where .= ' WHERE '.implode(' AND ', $criteres);
    }
     
    $this->pdoStatement = $this->pdo->prepare($sql_select.$sql_where);
     
    $executeIsOK = $this->pdoStatement->execute($params);
     
    //return $this->pdoStatement->execute($params);
    Trop compliqué pour moi mais je cherche à comprendre pour après pouvoir le faire le code.

    Merci pour l'affichage par tableau.

    bonne soirée.

  5. #5
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Bonsoir,

    Si je comprends : tu réussis a entrer les informations de la base de données mais pas à les récupérer

    Pour les récupérer il s'agit de faire une nouvelle requête

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT nom, sexe FROM joueur WHERE nom='le nom'

    a la place de 'le nom' tu met une variable récupérée via le formulaire dans ton script php
    n'hésite pas a poser des questions

  6. #6
    Membre expert
    Avatar de Dendrite
    Femme Profil pro
    Développeuse informatique
    Inscrit en
    Juin 2008
    Messages
    2 129
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 58
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeuse informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2008
    Messages : 2 129
    Points : 3 627
    Points
    3 627
    Billets dans le blog
    8
    Par défaut
    Trop compliqué pour moi mais je cherche à comprendre pour après pouvoir le faire le code.
    Pars de la fin :
    Dans PHPmyadmin, manipule le SQL avec tous les critères de filtre, et arrange-toi pour que ça retourne au moins 2 enregistrements.
    Et mets le SQL ici.

    Par ailleurs, sur ta checkbox, name est bon, c'est id qui n'est pas possible. Soit tu n'en mets pas (pas utile pour PHP), soit tu mets un id unique à chaque input. Name est commun, id (identifiant) est par définition unique.
    PDO, une soupe et au lit !
    Partir de la fin est un bon moyen de retrouver son chemin. Bibi - 2020

  7. #7
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    ok merci pour l'idée

    je vais essayer step by step

    Si d'autres idées ou solutions je reste preneur

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    MERCIIIIIIIIIIIIIII CELIRA

    j'ai réussi, après des heures d'acharnement, à faire fonctionner votre code sur les champs nom, sexe, secteur et cd ......tout fonctionne


    à vous


    il me reste encore 2 critères à intégrer dans la requête :

    - taille : >= ......

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM joueur WHERE taille >= $_POST['taille'];
    - catégorie entre : annéeA et annéeB

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM joueur WHERE categorie >= $_POST['catgorie'] AND <= $_POST['categorie2'];
    je ne sais pas si la synthaxe est correcte et comment intégrer ce code dans votre code.....

    merci d'avance pour vos retours

    je vais continuer à chercher

  9. #9
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    y aura pas 36 solution pour faire 2 requêtes :p
    regarde les opérateur de comparaison sql pour la suite

  10. #10
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Merci pour votre retour mais cela ne m'éclaire pas beaucoup...

    ma question est comment intégrer les requêtes sql dans le code proposait par Célira ?

    un exemple concret serait plus parlant pour moi.

    J'essaye beaucoup de choses mais pour l'instant sans succès.

  11. #11
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    Pareil que ce que t'a fais ici

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql_select = "SELECT nom, sexe, secteur, cd, categorie, taille FROM joueur ";
    mais tu mets les nouvelles requeête

  12. #12
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    soit tu mets 15km de code, soit juste 2 lignes.

    Merci de :
    • faire une synthèse, simple et concise, qu'on puisse comprendre ce que tu veux
    • fournir le TON code nécessaire et suffisant (ni plus, ni moins)
    • EXPLIQUE point par point ce que tu ne comprends pas (on ne peut pas répondre de manière globale)


    ...je ne sais pas si la synthaxe est correcte...
    Oui, la syntaxe est correcte.
    Sauf qu'il faut préparer la requête.

    ...un exemple concret serait plus parlant pour moi...
    C'est ce qu'à fait Celira.
    Il serait temps que tu apprennes un peu par toi-même, non ?
    notamment la syntaxe des requêtes préparées.

    ...J'essaye beaucoup de choses...
    La programmation, ce n'est pas de la magie. Ni la loterie.

    N.B. Quand on ne sait pas ou qu'on n'est pas sûr : on fait une recherche !
    ex. : "opérateur de comparaison sql"

  13. #13
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Pour être concis :

    je ne vois pas comment et où intégrer mes 2 requêtes SQL sur les champs Categorie et Taille.

    Concernant les autres critères, tout semble très bien fonctionner.
    J'ai tout rédigé avec une approche en POO, mes Classes, mes ClassesManager (CRUD, + maintenant fonction search (multicritères), mes vues, mes formulaires....

    nb :
    Je travaille beaucoup personnellement malgré vos propos pour comprendre la logique sous-jaccente (il y a 3 mois je n'y connaissais rien du tout et je m'y atèle en rentrant du travail)
    je cherche beaucoup pour y arriver d'où mes tentatives qui me paraissent logiques (pour un débutant) même si cela paraît de la magie.



    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
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
     
    public function search(contact $contact)
      {
     
                $sql_select = "SELECT * FROM joueur ";
     
                $criteres = [];
                $params = [];
     
                if (!empty($_POST['nom']))
                    {
                        // on crée un critère sur la colonne nom
                        $criteres[] = " nom= :nom";
                        $params[':nom'] = $_POST['nom'];
                    }
     
                if (!empty($_POST['sexe']))
                    {
                        // on crée un critère sur la colonne sexe
                        $criteres[] = " sexe= :sexe";
                        $params[':sexe'] = $_POST['sexe'];
                    }
     
     
     
                if (!empty($_POST['secteur'])) 
                    {
                        // on crée un critère sur la colonne secteur
                        $criteres[] = " secteur= :secteur";
                        $params[':secteur'] = $_POST['secteur'];
                    }
     
                if (!empty($_POST['cd']))
                    {
                       // cd est un tableau, on veut qu'une des cases cochées correspondent, on utilise une condition IN avec un paramètre par cd
                        $subCriteresEnum = [];
                        $i = 0;
     
     
                        foreach($_POST['cd'] as $comite)
                          {
                            $nomparam = ':cd_'.$i;
                            $subCriteresEnum[] = $nomparam;
                            $params[$nomparam] = $comite;
                            $i++;
                          }
     
                        $criteres[] = " cd IN (".implode(' , ', $subCriteresEnum).") ";
                    } 
     
        /*----------------------------------------------------------------*/         
                  // je ne comprends pas où insérer les requêtes préparées 
     
                  // $this->pdoStatement = $this->pdo->prepare('SELECT categorie FROM joueur WHERE categorie >= $_POST['catgorie'] AND <= $_POST['categorie2']'); 
                  // $this->pdoStatement->bindValue(':categorie', $contact->getCategorie(), PDO::PARAM_STR); => inutile puisque déjà lié avec $params ? donc utiliser $params['categorie']
     
                if (!empty($_POST['categorie'])) 
                    {                    
                      // on crée un critère sur la colonne texte
                        $criteres[] = " categorie= :categorie";
                        $params[':categorie'] = $_POST['categorie'];
     
     
                    }
     
     
     
                // $this->pdoStatement = $this->pdo->prepare("SELECT taille FROM joueur WHERE taille >= $_POST['taille']");  
                // $this->pdoStatement->bindValue(':taille', $contact->getTaille(), PDO::PARAM_STR); => inutile puisque déjà lié avec $params
     
                if (!empty($_POST['taille'])) 
                    {
                        // on crée un critère sur la colonne texte
                        $criteres[] = " taille= :taille";
                        $params[':taille'] = $_POST['taille'];
     
                     }
     
        /*----------------------------------------------------------------*/ 
     
                // on concatène les critères pour construire la requête
     
                $sql_where = '';
                if (!empty($criteres))
                    {
                        $sql_where .= ' WHERE '.implode(' AND ', $criteres);
                    }
     
     
                $this->pdoStatement = $this->pdo->prepare($sql_select.$sql_where);
     
     
     
     
                $executeIsOK = $this->pdoStatement->execute($params);
     
                //return $this->pdoStatement->execute($params); */
     
     
     
     
                //faire une boucle 
     
                $contacts = [];
     
                while ($contact = $this->pdoStatement->fetchObject('Contact'))      // ou bien essayer fetchAll((PDO::FETCH_ASSOC));
                  { 
                  $contacts [] = $contact; // tableau des contacts renseignés par la variable $contact (les contacts trouvés)
                  }
                return $contacts; 
     
      }
    j'ai travaillé sur votre tuto "PHP - Création "à la volée" d'un tableau html :" pour afficher mes résultats dans un tableau....merci

    Bien à vous

  14. #14
    Invité
    Invité(e)
    Par défaut
    Si tu ne comprends RIEN au code, il faut le dire...
    Il n'y a pas de honte, et ça fait partie de l'apprentissage.

    Comprends-tu ces bouts de code ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        if (!empty($_POST['taille'])) 
                    {
                        // on crée un critère sur la colonne texte
                        $criteres[] = " taille= :taille";
                        $params[':taille'] = $_POST['taille'];
     
                     }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                // on concatène les critères pour construire la requête
                $sql_where = '';
                if (!empty($criteres))
                    {
                        $sql_where .= ' WHERE '.implode(' AND ', $criteres);
                    }
    As-tu eu la curiosité d'afficher les variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    var_dump($criteres); // array
    var_dump($params); // array
    var_dump($sql_where); // string
    Le principe est de fabriquer le "WHERE...." de la requête :
    • pour chaque critère, on crée un bout de la requete
    • à la fin, on rassemble les morceaux : ' WHERE '.implode(' AND ', $criteres);

  15. #15
    Membre extrêmement actif
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Avril 2018
    Messages
    537
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Avril 2018
    Messages : 537
    Points : 634
    Points
    634
    Par défaut
    et avant de construire une requête par concaténation essaye deja de la construire en une fois

  16. #16
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2015
    Messages
    262
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Décembre 2015
    Messages : 262
    Points : 121
    Points
    121
    Par défaut
    Merci pour votre aide.....le var_dump m'a beaucoup servi.... j'ai compris le fonctionnement du code..

    Du coup, j'ai réussi à créer l'intégralité de mes critères et tous mes résultats sont corrects.


    Merci beaucoup....je vais m'attaquer à de nouveaux objectifs....

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

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/08/2014, 11h56
  2. Formulaire de recherche multi-critères.
    Par Poor_Beginner dans le forum IHM
    Réponses: 4
    Dernier message: 25/01/2007, 18h58
  3. Formulaire de recherche multi critères
    Par tomas dans le forum Access
    Réponses: 6
    Dernier message: 24/08/2006, 14h57
  4. Formulaire de recherche multi-critère
    Par Bolton8ox dans le forum Access
    Réponses: 1
    Dernier message: 24/07/2006, 19h40
  5. Réponses: 6
    Dernier message: 28/06/2006, 15h01

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