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 :

Filtres SQL problème de requête


Sujet :

PHP & Base de données

  1. #1
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut Filtres SQL problème de requête
    bonjour à tous,
    j'ai une question sur une raquette SQL : je voudrai filtrer par département ET/OU par catégorie ET/OU par code postale. Quand je mets OU ça fonctionne mais quand je mets AND rien ne s'affiche. Quelqu'un peut m'aider ?
    Voici le code sql :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php mysql_select_db($database_annuaire, $annuaire);
    $query_rs_annonce = sprintf("SELECT * FROM an_annonce WHERE nomcat=%s AND dept=%s OR cp=%s", GetSQLValueString($colnomcat_rs_annonce, "text"),GetSQLValueString($coldept_rs_annonce, "text"),GetSQLValueString($colcp_rs_annonce, "int"));
    $query_limit_rs_annonce = sprintf("%s LIMIT %d, %d", $query_rs_annonce, $startRow_rs_annonce, $maxRows_rs_annonce);
    $rs_annonce = mysql_query($query_limit_rs_annonce, $annuaire) or die(mysql_error());
    $row_rs_annonce = mysql_fetch_assoc($rs_annonce);
    ?>

  2. #2
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Personne n'a une idée ?
    du coup de je suis obligé de mettre AND sinon ça ne fonctionne pas.
    Je voudrai arriver à filtrer avec ET OU cad en remplissant un champ ET/OU 2 champs ET/OU trois champs. Merci d'avance.


    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
    $coldept_rs_annonce = "0";
    if (isset($_GET['dept'])) {
      $coldept_rs_annonce = $_GET['dept'];
    }
    $colnomcat_rs_annonce = "0";
    if (isset($_GET['cat'])) {
      $colnomcat_rs_annonce = $_GET['cat'];
    }
    $colcp_rs_annonce = "0";
    if (isset($_GET['cp'])) {
      $colcp_rs_annonce = $_GET['cp'];
    }
    mysql_select_db($database_annuaire, $annuaire);
    $query_rs_annonce = sprintf("SELECT * FROM an_annonce WHERE (dept=%s AND nomcat=%s AND cp=%s", GetSQLValueString($coldept_rs_annonce, "text"),GetSQLValueString($colnomcat_rs_annonce, "text"),GetSQLValueString($colcp_rs_annonce, "int"));
    $query_limit_rs_annonce = sprintf("%s LIMIT %d, %d", $query_rs_annonce, $startRow_rs_annonce, $maxRows_rs_annonce);
    $rs_annonce = mysql_query($query_limit_rs_annonce, $annuaire) or die(mysql_error());
    $row_rs_annonce = mysql_fetch_assoc($rs_annonce);

  3. #3
    Modérateur
    Avatar de Vil'Coyote
    Homme Profil pro
    Développeur adélia & Web
    Inscrit en
    Février 2008
    Messages
    4 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur adélia & Web
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 4 583
    Points : 7 503
    Points
    7 503
    Par défaut
    les requêtes sql sont bornées et ce jouent par priorité. donc un "et / ou " n'existe pas tu doit générer autant de cas que tu le souhaites en réalisation séparé par des () pour limité cas.

    (nomcat=%s AND dept=%s) OR (nomcat=%s and cp=%s) or ( etc ....) or ( ....)

    je pense que tu auras plus d'aide dans la section SQL que DW puisque la question n'y est pas liée.
    la vie n'est pas cirrhose des foies ...

    Avant de poster un message Rechercher n'est pas qu'une option.
    FAQ Web - Tuto Web

  4. #4
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    Bonjour et merci pour cette réponse.
    Effectivement ça fonctionne en filtrant sur 2 champs.
    Mais impossible sur 3 champs
    Si je fais (nomcat=%s AND dept=%s AND cp=%s) alors ça affiche le nombre total d'enregistrement

    une petite idée ? c'est quand même spécifique à Dreamweaver si je pose la qestion dans SQL j'ai peur de ne pas avoir de réponse.*

    Merci d'avance

  5. #5
    Modérateur
    Avatar de Vil'Coyote
    Homme Profil pro
    Développeur adélia & Web
    Inscrit en
    Février 2008
    Messages
    4 583
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur adélia & Web
    Secteur : Industrie

    Informations forums :
    Inscription : Février 2008
    Messages : 4 583
    Points : 7 503
    Points
    7 503
    Par défaut
    affiche ta requête en clair pour vérifier qu'elle est correct. car en principe sauf si tout tes éléments choisi on un même nomcat, dept, cp tu ne devrais avoir que ceux disposant de ses infos.
    la vie n'est pas cirrhose des foies ...

    Avant de poster un message Rechercher n'est pas qu'une option.
    FAQ Web - Tuto Web

  6. #6
    Nouveau membre du Club
    Inscrit en
    Avril 2010
    Messages
    71
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 71
    Points : 38
    Points
    38
    Par défaut
    voici la requête :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM an_annonce
    WHERE (dept=coldept OR cp=colcp OR nomcat=colnomcat)  OR (dept=coldept AND cp=colcp AND nomcat=colnomcat) OR (cp=colcp AND nomcat=colnomcat) OR (dept=coldept AND cp=colcp) OR (dept=coldept AND nomcat=colnomcat) OR (cp=colcp OR nomcat=colnomcat) AND (dept=coldept OR cp=colcp) AND (dept=coldept OR nomcat=colnomcat)
    je l'affiche aussi sans code pour être plus lisible :

    SELECT *
    FROM an_annonce
    WHERE (dept=coldept OR cp=colcp OR nomcat=colnomcat) OR (dept=coldept AND cp=colcp AND nomcat=colnomcat) OR (cp=colcp AND nomcat=colnomcat) OR (dept=coldept AND cp=colcp) OR (dept=coldept AND nomcat=colnomcat) OR (cp=colcp OR nomcat=colnomcat) AND (dept=coldept OR cp=colcp) AND (dept=coldept OR nomcat=colnomcat)

  7. #7
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 99
    Points : 129
    Points
    129
    Par défaut
    Citation Envoyé par Vil'Coyote
    je pense que tu auras plus d'aide dans la section SQL que DW puisque la question n'y est pas liée.
    Citation Envoyé par cris84
    c'est quand même spécifique à Dreamweaver si je pose la qestion dans SQL j'ai peur de ne pas avoir de réponse
    Cela n'a rien à voir avec Dreamweaver, ce type de requête est trop complexe pour DW.

    En mettant des OR partout il est normal que la requête renvoi tout.

    C'est comme si tu demandais je veux les t-shirts (bleu OU xl) OU (bleu ET xl) = tu auras tous les (t-shirts bleu + tous les t-shirts xl) + (tous les t-shirts bleu ET xl).

    Une solution est d'écrire dynamiquement la requête en fonction des éléments remplis.

    Bonjour,

    Pour Cris84, ci-dessous une variante adaptée à ton cas et à compléter

    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
    $request = '"AND" = "AND"';
    // début de la requête variable, ce "AND" = "AND" permet de construire un début valide, même si la suite des champs est vide.
     
    if ( $_GET['dept'] != "*" ) {
      $request .= ' AND  dept = "'.$_GET['dept'].'"';
    }
     
    if ( $_GET['cat'] != "*" ) {
      $request .= ' AND  nomcat = "'.$_GET['cat'].'"';
    }
     
    ...
     
    SELECT *
    FROM an_annonce
    WHERE $request
    Evidement il faut filtrer tout cela sinon gare aux injections SQL.

Discussions similaires

  1. [SQL] Problème de requête et <tr>+<td>
    Par ruty dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 15/08/2006, 09h10
  2. [SQL] Problème bizarre requête date
    Par masseur dans le forum PHP & Base de données
    Réponses: 4
    Dernier message: 17/02/2006, 13h12
  3. [Oracle] [SQL] problème de requête
    Par joselito dans le forum PHP & Base de données
    Réponses: 24
    Dernier message: 25/01/2006, 12h55
  4. [SQL]problème de requête.
    Par shnouf dans le forum Oracle
    Réponses: 21
    Dernier message: 24/01/2006, 11h12
  5. [SQL] Problème de requête SQL de plus de 8060 caractères ?
    Par webtheque dans le forum MS SQL Server
    Réponses: 13
    Dernier message: 06/04/2005, 15h07

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