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 :

moteur de recherche boucle avec like et and


Sujet :

PHP & Base de données

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut moteur de recherche boucle avec like et and
    Bonjour,
    voici ma méthode et ma requête sql pour un moteur de recherche

    $s étant les mots clé tapé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
    $detail_s = explode(" ",$s);
    $WHERE = "WHERE";
    $count = 0;
    reset ($detail_s);
    while(list($key, $data) = each($detail_s))
       {
    	$count = $count + 1;
    	if ($count == 1) { $WHERE .= " t.name LIKE '%".$data."%' "; } 
    	else { $WHERE .= " OR t.name LIKE '%".$data."%' "; } 
      }
     
    $query = "
    SELECT id 
    FROM p 
    JOIN tp ON tp.p = p.id 
    JOIN t ON tp.t = t.id 
    ".$WHERE." 
    ORDER BY p.d DESC ";
    Ce code marche très bien par contre j'utilise OR pour séparer la recherche de chaque mot. donc mon moteur de recherche et finalement très peu pratique.

    J'ai essayé de remplacer OR par AND afin de rendre tous sa plus cohérent et pratique seulement avec AND le moteur de recherche me retourne plus aucun résultat alors que des résultats existent

    Il y a t'il une solution pour pouvoir utiliser AND dans ce code ???
    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Oui enfin si ça fonctionne avec OR et mais pas avec AND c'est qu'il y a une raison : ce ne sont pas des mots qu'on peut intervertir pour faire plus joli !

    Votre requête avec les OR correspond à votre besoin, gardez-là.

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    Justement si je souhaite utiliser AND c'est que OR ne me convient pas.
    Si je recherche par exemple veste cuir mon résultat sera tous les éléments dont les tags contiennent veste ou cuir ce qui n'est vraiment pas pratique quand on cherche que les vestes en cuir.

    AND va me permettre de cibler mes recherches et donc dans cette exemple de ne récupérer que les vestes en cuir.

    Il y a certainement un moyen de remplacer OR par AND dans cette requête autres que de remplacer uniquement les 2 termes.

  4. #4
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 394
    Points
    18 394
    Par défaut
    Dans votre exemple de veste en cuir, il vous faudrait faire :

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    j'ai essayé mais sa ne me renvoi aucun résultat.

    J'ai recherché encore pas mal, c'est très étonnant que AND ne marche pas dans mon cas sa semble être la seul solution. peut être une simple erreur dans mon script

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Quel est le SGBD ?

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    j'utilise mysql

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    OK. Que donne la requête suivante ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT COLLATION (t.name)
    FROM t

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    la requete renvoi l'inter classement latin1_general_ci sur 2 pages tous identiques

  10. #10
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    oui, j'aurais pu te rajouter un LIMIT 1

    Bon, ce n'est pas un problème de casse... peux-tu nous donner un exemple de la façon dont apparaissent tes vestes en cuir, ainsi qu'un echo $squery ?

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    avec le code présent sur mon premier post j'affiche toutes les vestes et tous les articles en cuir ce qui est logique vu que j'utilise OR seulement ce n'est pas pratique pour quelqu'un qui souhaite que des vestes en cuir.

    Seulement quand j'utilise AND à la place de OR ce qui me semble logique, la requete ne me retourne plus aucun résultat.

    Le $query est construit dans le premier post, j'ai encore cherché une solution toute la journée mais rien à faire

  12. #12
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par Overstone Voir le message
    avec le code présent sur mon premier post j'affiche toutes les vestes et tous les articles en cuir ce qui est logique vu que j'utilise OR seulement ce n'est pas pratique pour quelqu'un qui souhaite que des vestes en cuir.
    OK. Peux-tu regarder à la main dans ta table et nous montrer un exemple de t.name pour une veste en cuir ?
    Citation Envoyé par Overstone Voir le message
    Le $query est construit dans le premier post, j'ai encore cherché une solution toute la journée mais rien à faire
    J'ai bien compris. Peux-tu ajouter echo $query dans ton code, tester and veste et cuir, et nous donner le résultat du echo $query ?

  13. #13
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    Pour la question 2 voici le résultat de l'echo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT id 
    JOIN tp ON tp.p = p.id 
    JOIN t ON tp.t = t.id 
    WHERE t.name LIKE '%veste%' 
    AND t.name LIKE '%cuir%' 
    GROUP BY p.id 
    ORDER BY p.d DESC
    si j'ai bien compris la question 1)
    pour un exemple manuellement je peu trouver une 10ene d'articles ayant des relations avec veste et cuir via tp.

  14. #14
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Merci pour la requête !

    Citation Envoyé par Overstone Voir le message
    si j'ai bien compris la question 1)
    pour un exemple manuellement je peu trouver une 10ene d'articles ayant des relations avec veste et cuir via tp.
    peux-tu nous en copier-coller qq-uns ?

  15. #15
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    par exemple un article à comme tag : veste,cuir,sympa ...
    un autre : veste,cuir,diesel
    un autre : veste,cuir,rouge

  16. #16
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    Citation Envoyé par Overstone Voir le message
    Pour la question 2 voici le résultat de l'echo

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT id 
    JOIN tp ON tp.p = p.id 
    JOIN t ON tp.t = t.id 
    WHERE t.name LIKE '%veste%' 
    AND t.name LIKE '%cuir%' 
    GROUP BY p.id 
    ORDER BY p.d DESC
    il ne manquerait pas un FROM là-dedans ?

  17. #17
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    non c'est une erreur de ma part en recopiant le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT id 
    FROM p
    JOIN tp ON tp.p = p.id 
    JOIN t ON tp.t = t.id 
    WHERE t.name LIKE '%veste%' 
    AND t.name LIKE '%cuir%' 
    GROUP BY p.id 
    ORDER BY p.d DESC

  18. #18
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    ok. qu'est-ce que ça donne si tu la testes sans passer par ton code PHP ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT id 
    FROM p
    JOIN tp ON tp.p = p.id 
    JOIN t ON tp.t = t.id 
    WHERE t.name LIKE '%veste%' 
    AND t.name LIKE '%cuir%' 
    GROUP BY p.id 
    ORDER BY p.d DESC
    et avec cette version de test ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    SELECT p.id, tp.t, t.id, t.name
    FROM p
    right JOIN tp ON tp.p = p.id 
    right JOIN t ON tp.t = t.id 
    WHERE t.name LIKE '%veste%' 
    AND t.name LIKE '%cuir%' 
    GROUP BY p.id 
    ORDER BY p.d DESC

  19. #19
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 285
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 285
    Points : 11 740
    Points
    11 740
    Par défaut
    au passage, tu utilises bien un or die(mysql_error()) après ton mysql_query ? parce le id de ton SELECT est ambigu, et ta requête devrait te faire une erreur de syntaxe.

  20. #20
    Membre régulier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    240
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 240
    Points : 81
    Points
    81
    Par défaut
    oui j'ai vérifier mes erreurs mais je n'en est aucune, je retourne aucun résultat sans erreur.

    Je pense que mon probleme est du à l'utilisation de la relation tp et t.name

Discussions similaires

  1. [CS3] Moteur de recherche et requête LIKE
    Par HAbroc dans le forum Dreamweaver
    Réponses: 6
    Dernier message: 19/05/2009, 23h42
  2. integration moteur de recherche perl avec easyphp
    Par sculpteur dans le forum Web
    Réponses: 0
    Dernier message: 27/09/2007, 16h28
  3. moteur edition/rechercher pb avec ff (document.layers ?)
    Par jocoat dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 07/09/2007, 10h11
  4. Moteur de recherche interne avec zope/python
    Par tunix dans le forum Zope
    Réponses: 3
    Dernier message: 01/05/2006, 16h45

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