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 :

Construction de la condition pour une recherche multicritères [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Construction de la condition pour une recherche multicritères
    Bonsoir,

    Voilà, pas de soucis avec les champs simples mais comment faire le WHERE quand , depuis un SELECT, je veux faire ma recherche soit sur un item de la liste (çà j'arrive) soit sur TOUS les items de la liste ?

    J'ai pensé à "AND statut IN (Active, Autre, Compromis,etc.)" mais si je rajoute un statut ultérieurement il faudra que je reprenne toutes les requêtes.

    Une idée ? une solution ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    ...
    if(isset($_POST['statut']) && !empty($_POST['statut'])) {
    if((isset($_POST['statut'])) = 'Tous') {  // Si tous les statuts :  AND statut IN (Active, Autre, Compromis,etc.)		?
    $where.=.'AND ';
    }
    Merci de votre aide.

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    D'où provient ta liste de statuts ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 58
    Points
    58
    Par défaut C'est tout simple
    S'il y a un critère vous ajoutez une condition dans le Where sinon vous ne l'ajoutez pas.
    Pour avoir un select du type :
    SELECT col1, col2 ... FROM t1 WHERE c1=valeur1
    ou
    SELECT col1, col2 ... FROM t1 WHERE c1= valeur1 AND c2=valeur2
    Remarques :
    1 - L'opérateur de comparaison d'égalité est == et non pas =
    2 - Votre besoin n'est pas apparemment multi-critères mais plutôt 1 ou tous;
    Si vous deviez gérer 0 ou 1 ou N la solution serait différente

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 58
    Points
    58
    Par défaut Un exemple simple
    Pour compléter ma réponse.
    voici un début de script, ensuite il suffit d'insérer dans la BD.
    Admettons une table Personnes(id, prenom, age, statut).
    Et une sélection sur l'âge et le statut.
    Testez, inutile pour voir le fonctionnement d'avoir la table dans la BD.

    <?php
    if(isSet($_GET["cb_valider"]))
    {
    $age = $_GET["age_mini"];
    $statut = $_GET["statut"];

    $sql = "SELECT * FROM personnes WHERE age >=$age ";
    if($_GET["statut"] != "tous" && $_GET["statut"] != "") $sql .= " WHERE statut ='$statut'";
    echo $sql;
    }

    ?>

    <form action="" method="get">
    <label>Recherche</label><br />
    <label>Age mini</label><input name="age_mini" type="text" value="10" />
    <select name="statut" size="3">
    <option value="homme">Homme</option>
    <option value="femme">Femme</option>
    <option value="enfant">Enfant</option>
    <option value="tous">Tous</option>
    </select>
    <input type="submit" name="cb_valider" />
    </form>

    Remarque :
    utilisation de la méthode "get".
    Sémantiquement le POST est réservé aux modifications de ressources serveur.

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Reponse à SEB
    Bonjour,
    STATUT est une table de la base

    Merci de ta réponse. En fait j'ai un "select" dynamique (alimenté par la table statut) dans ma recherche multicritères. Je souhaite pouvoir faire une recherche soit sur UN statut soit sur TOUS les statuts (TOUS n'est pas un champs de la table).

    La question c'est de savoir comment je dois formuler ma requête ?

    // Cas 1 : l'utilisateur a choisi un statut
    Sélectionne le statut depuis la table statut ou statut = valeur saisie;
    // Cas 2 : l'utilisateur ne choisit pas un statut donc il veut voir tous les enregistrements quelque soit leur statut
    Si statut = 'tous' ... ?

    Dans le cas 2, faut il laisser le champs vide ou "nommer" chaque valeur de statut ?
    cad :
    Si statut = 'tous'
    Sélectionne statut depuis statut ou statut = ... OR statut = .. OR etc.
    ou bien
    Je laisse la condition vide, comme ça il prend tous les enregistrements sans se soucier du statut ?

    J'espère que je suis clair.
    Merci de votre aide.

    PS. Si vous connaissez un bon tutoriel qui explique simplement comment rédiger des requêtes un peu complexes, je suis preneur.

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Réponse à pascalbuguet
    Bonjour et merci de ta réponse.

    J'ai appris quelque chose à propos de la sémantique (get et post).

    Je modifie ma requête et teste ton exemple de code. J'ai répondu à SEB en précisant mon attente en français. Donc si tu as quelque chose à ajouter ...

    Bonne journée

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 58
    Points
    58
    Par défaut Du nouveau
    bonjour,
    une petite erreur s'était glissée dans mon script
    remplacez "$sql .= " WHERE statut ='$statut'";"
    par "$sql .= " AND statut ='$statut'";"

    A par cela je ne vois pas la différence du fait que les statuts soient stockés dans une table de la BD.
    Il faut bien qu'il y ait un champ de liaison avec l'autre table.
    Admettons la table personnes (id, prenom, age, statut)
    et la table statuts(statut)
    L'élément <select> est rempli dynamiquement à partir de la table.
    Plus une <option> statique avec 'tous' comme valeur.
    Le reste du script est identique ...
    Le voici

    <?php
    mysql_connect("localhost","root","");
    mysql_select_db("testdeveloppezcom");
    ?>

    <?php
    if(isSet($_GET["cb_valider"]))
    {
    $age = $_GET["age_mini"];
    $statut = $_GET["statut"];

    $sql = "SELECT * FROM personnes WHERE age >=$age ";
    if($_GET["statut"] != "tous" && $_GET["statut"] != "") $sql .= " AND statut ='$statut'";
    echo $sql, "<br/>";
    $rs = mysql_query($sql);
    while($enr = mysql_fetch_array($rs))
    {
    echo $enr['prenom'], "<br />";
    }
    }

    ?>
    <br/>
    <form action="" method="get">
    <label>Recherche</label><br />
    <label>Age mini</label><input name="age_mini" type="text" value="10" />
    <select name="statut" size="3">
    <option value='tous'>Tous</option>
    <?php
    $rs = mysql_query("SELECT statut FROM statuts");
    while($enr = mysql_fetch_row($rs))
    {
    echo "<option value='$enr[0]'>$enr[0]</option>";
    }
    ?>
    </select>
    <input type="submit" name="cb_valider" />
    </form>

    Si la réponse n'est toujours pas la bonne, il me faudrait la structure des 2 tables de la BD en question.
    Et le résultat attendu.
    Bon courage.

    PS : pour les requêtes complexes les tutos SQL ne doivent pas manquer sur ce site ou ailleurs.

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Ok pour la requete, mais mon SQL plante ...
    bonjour,

    Voici le code PHP qui fonctionne. Par contre j'ai modifié ma requete SQL et j'ai une erreur ...
    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
     
    // Creation de la requete
    				$sql="SELECT prospects.nomprospects, prospects.refprospects, prospects.telprospects, prospects.gsmprospects, finance.statut * FROM prospects INNER JOIN finance ON prospects.idprospects = finance.idprospects WHERE ";
    				if(isset($_GET['nom']) && !empty($_GET['nom'])) {
    					$where.='nomprospects'.' LIKE \'%'.$_GET['nom'].'%\'' .'AND ';
    				}
    				if(isset($_GET['ref']) && !empty($_GET['ref'])) {
    					$where.='refprospects=\''.$_GET['ref'].'\''.'AND ';
    				}
    				if(isset($_GET['tel']) && !empty($_GET['tel'])) {
    					$where.='telprospects'.' LIKE \'%'.$_GET['tel'].'%\'' .' OR '.'gsmprospects'.' LIKE \'%'.$_GET['tel'].'%\' '.'AND ';
    				}
    				if(isset($_GET['statut']) && !empty($_GET['statut'])) {
    					if ($_GET['statut'] != 'Tous') {
    					$where.='finance.statut=\''.$_GET['statut'].'\' '.'AND ';
    					}
    					else {
    							if(isset($_GET['origine']) && !empty($_GET['origine'])) {
    								if ($_GET['origine'] !='Tous') {
    								$where.='prospects.origine_origine=\''.$_GET['origine'].'\' '.'OR '.' '.'finance.origine=\''.$_GET['origine'].'\' '.'AND ';
    								}
    								else {
    									if(isset($_GET['typefi']) && !empty($_GET['typefi'])) {
    										if ($_GET['typefi'] != 'Tous') {
    										$where.='finance.fitype=\''.$_GET['typefi'].'\' '.'AND ';
    										}
    									}
    								}	
    							}
    						}	
    					}	
    					if(isset($_GET['tri']) && !empty($_GET['tri'])) {
    						$tri = $_GET['tri'];
    					}
    				// ***Finalisation de la recherche par les donnees entreprise***
    				$where = substr($where,0,strlen($where)-5);
    				$sql =$sql. $where.(" ORDER BY ").$tri.(" ASC");

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    185
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 185
    Points : 79
    Points
    79
    Par défaut Requete SQL corrigée
    Tout fonctionne convenablement (oubli * avant from)
    Merci

  10. #10
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 58
    Points
    58
    Par défaut Une petite remarque
    puisque SQL délimite les chaînes avec des '
    et que PHP les délimite soit avec des " soit avec des '
    préférez les " en PHP
    Vos concaténations deviennent plus faciles à écrire, à lire et plus rapides en exécution.
    De plus les " permettent toujours l'interpolation (sauf avec les super globales).
    Ce n'est pas le cas avec les '.
    Exemple de vos $where :

    $where.='nomprospects'.' LIKE \'%'.$_GET['nom'].'%\'' .'AND ';
    devient
    $where.="nomprospects LIKE '%" . $_GET['nom'] . "%' AND ";

  11. #11
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 104
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 104
    Points : 8 222
    Points
    8 222
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par pascalbuguet Voir le message
    devient
    $where.="nomprospects LIKE '%" . $_GET['nom'] . "%' AND ";
    On peut même faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $where .= "nomprospects LIKE '%{$_GET['nom']}%' AND " ;
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  12. #12
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2006
    Messages : 43
    Points : 58
    Points
    58
    Par défaut
    bonjour,
    ah! je ne connaissais pas.
    Merci pour l'info.
    bonne journée

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

Discussions similaires

  1. Procedure stockée pour une recherche multicritère
    Par souma21 dans le forum Développement
    Réponses: 5
    Dernier message: 14/05/2012, 16h28
  2. 2 conditions pour une recherche
    Par laurentSc dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 24/09/2011, 16h31
  3. [XL-2010] Macro ou Formule pour une recherche verticale avec condition
    Par Orsaylg dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 15/09/2010, 13h22
  4. Importance des accents pour une recherche dans postgre
    Par glouf dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 05/03/2005, 13h25
  5. [VB.NET] Quel objet tableau pour une recherche indexée ???
    Par Kitano dans le forum Windows Forms
    Réponses: 7
    Dernier message: 02/09/2004, 09h38

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