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 :

requête avec multiple And et COLLATE utf8_unicode_ci LIKE '%%" [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Inscrit en
    Juillet 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 407
    Par défaut requête avec multiple And et COLLATE utf8_unicode_ci LIKE '%%"
    Bonjour
    j'essaye de passer une requête qui me permet de trouver de multiples champs, mais la requête renvoie un résultat uniquement si le champ est rempli, si il est vide la requête ne renvoie rien et il ya donc une erreur.
    Comment faire pour que si des champs sont laissés vide par l'utilisateur, la requête n'en tienne pas compte.
    Je ne sais pas si c'est clair, je veux que si l'utilisateur rempli le champ titre1 par exemple ,la requête ressorte toutes les fiches ayant la variable titre1 sans tenir compte si les autres champs sont remplis ou non.
    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
    $masterech=
      "titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' 
     AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%' 
     AND realis COLLATE utf8_unicode_ci LIKE '%" . $realisateur . "%' 
      AND monteur COLLATE utf8_unicode_ci LIKE '%" . $monteur . "%' 
      AND truq COLLATE utf8_unicode_ci LIKE '%" . $truquiste . "%' 
      AND compo COLLATE utf8_unicode_ci LIKE '%" . $compositeur . "%' 
      AND musiq COLLATE utf8_unicode_ci LIKE '%" . $musik . "%' 
      AND contact COLLATE utf8_unicode_ci LIKE '%" . $contact . "%' 
      AND speak1 COLLATE utf8_unicode_ci LIKE '%" . $speak1 . "%' 
      AND speak2 COLLATE utf8_unicode_ci LIKE '%" . $speak2 . "%'
      AND v1 COLLATE utf8_unicode_ci LIKE '%" . $v1 . "%' 
      AND v2 COLLATE utf8_unicode_ci LIKE '%" . $v2 . "%' 
      AND formator COLLATE utf8_unicode_ci LIKE '%" . $formatorigine . "%' 
      AND standard COLLATE utf8_unicode_ci LIKE '%" . $standard . "%' 
      AND contenu COLLATE utf8_unicode_ci LIKE '%" . $contenu . "%' 
      AND observation COLLATE utf8_unicode_ci LIKE '%" . $observation . "%'";
     
     $sqlafichmaster= "SELECT * FROM  films WHERE $masterech  ORDER BY master DESC " ;
     
    $resultat1 = mysql_query($sqlafichmaster) or die(mysql_error());
    while ($master =mysql_fetch_array ($resultat1)){

  2. #2
    Membre chevronné
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Par défaut
    Tu dois construire ta requête au fur et à mesure, en testant via PHP si tes variables sont vides ou non.

    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
     
    $masterech= '';
    if(strlen($titre1))
    $masterech .=  "titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' AND ";
     
    if (strlen($titre2))
    $masterech .= "titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%' AND ";
     
    // etc ...
    // penser à supprimer le dernier AND de la chaine 
     
     $sqlafichmaster= "SELECT * FROM  films WHERE $masterech  ORDER BY master DESC " ;
     
    $resultat1 = mysql_query($sqlafichmaster) or die(mysql_error());
    while ($master =mysql_fetch_array ($resultat1)){

  3. #3
    Membre éclairé

    Homme Profil pro
    Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Inscrit en
    Juillet 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 407
    Par défaut
    merci Isythiel

    mais je pense qu'il ya 2 bug dans ta proposition.
    1 la variable $masterech est redifini a chaque nouvelle valeur, si plus d'une valeur est définit je perd la première requête. j'ai donc numéroté les variables.
    2 les AND à la fin provoquent une erreur si il n'y a qu'un champ défini, je les ait mis devant mais la j'ai un souci si c'est la premiere valeur définit.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    if(strlen($titre1))
    $masterech0 .=  "AND titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' ";
     
    if (strlen($titre2))
    $masterech1 .= "AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
     
     if (strlen($realisateur))
    $masterech2 .= "AND realis COLLATE utf8_unicode_ci LIKE '%" . $realisateur . "%'  "; 
     
    $masterech=$masterech1.$masterech2;
    pour résoudre ça je pensais faire un compteur qui définit si c'est la première ligne et dans ce cas ne pas mettre le and.
    je voulais faire quelque chose comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    $compteur=0
    if (strlen($titre2)){
    $masterech1 .= "titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
    if ($compteur>0)
    $masterech1 .= " AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
    $compteur=1
    }
    // et pareil pour la suite
    Je n'ai pas testé si ça fonctionnait, et peut être existe t-il une façon plus simple?

  4. #4
    Membre éclairé

    Homme Profil pro
    Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Inscrit en
    Juillet 2006
    Messages
    407
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Webmaster, Réalisateur Vidéo, Chef de projet Web documentaire
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2006
    Messages : 407
    Par défaut
    la bonne syntaxe est celle la semble t-il
    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
    //titre1 si ce n'est pas la premiere requete
    if (strlen($titre1) AND ($compteur>0))
    $masterech1 .= "AND titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%'  ";
    // si 1ere requete
    if (strlen($titre1) AND ($compteur==0)){
    $masterech1 .= " titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%'  ";
    $compteur=1;
    }
    //idem pour autres variables 
    if (strlen($titre2) AND ($compteur>0))
    $masterech1 .= "AND titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
    // si 1ere requete
    if (strlen($titre2) AND ($compteur==0)){
    $masterech1 .= " titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%'  ";
    $compteur=1;
    }

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    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
    Billets dans le blog
    12
    Par défaut
    Bonsoir,

    Le mieux au lieu de trainer des AND partout avec un compteur c'est de passer par un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $where = array();
     
    if (strlen($titre1)) {
       $where[] =  "titre1 COLLATE utf8_unicode_ci LIKE '%" . $titre1 . "%' ";
    }
     
    if (strlen($titre2)) {
       $where[] =  "titre2 COLLATE utf8_unicode_ci LIKE '%" . $titre2 . "%' ";
    }
     
    // ... ... ... //
     
    // à la fin : 
    $sqlWhere = implode(' AND ', $where);
    Lisible et plus propre

  6. #6
    Membre chevronné
    Femme Profil pro
    Développeur .NET
    Inscrit en
    Avril 2009
    Messages
    339
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Marne (Champagne Ardenne)

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

    Informations forums :
    Inscription : Avril 2009
    Messages : 339
    Par défaut
    C'est pour ça que j'avais dit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    // penser à supprimer le dernier AND de la chaine

    ...

    Je te donnais l'algo, j'ai pas testé le code mais l'idée y était...
    Après à toi de l'adapter à ta situation.

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

Discussions similaires

  1. Requête avec conditions multiples (OR/AND) sur le même champ
    Par GueloSuperStar dans le forum Langage SQL
    Réponses: 31
    Dernier message: 05/03/2013, 10h42
  2. [Hibernate] Requête avec un LIKE %% case insensitive
    Par n@n¤u dans le forum Hibernate
    Réponses: 4
    Dernier message: 21/06/2006, 17h27
  3. Calcul requête avec conditions multiples
    Par Phullbrick dans le forum Access
    Réponses: 7
    Dernier message: 18/04/2006, 13h45
  4. Requête avec multiple clause where
    Par pgenet dans le forum Requêtes
    Réponses: 3
    Dernier message: 07/03/2006, 13h59
  5. Requête avec l'expression Like
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 02/09/2003, 09h39

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