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 :

requete sql et plusieurs clauses LIKE


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 78
    Par défaut requete sql et plusieurs clauses LIKE
    Bonjour,

    Savez vous comment faire une requete du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT image, description, prix, titre, prenom, adressemail, telephone FROM annonce INNER JOIN vendeur ON annonce.idvendeur=vendeur.idvendeur WHERE titre LIKE ? AND titre LIKE ?";
    Ce qui m'intéresse c'est le code PHP pour exécuter la req. J'ai beau cherché depuis des jours je ne trouve pas!

    si je fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resultat->execute(array("%".$var1."%","%".$var2."%"));
    ça marche pas. Comment faire?

  2. #2
    Membre émérite
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2006
    Messages : 1 162
    Par défaut
    Tout dépend du SGBD que tu as derrière. MySQL? SQlite? Postgre? SQL Server? Oracle? ...?

    T'as des fonctions propres par SGBD ou si tu utilises un ORM, c'est lui qui se charge, en général, de faire le boulot de requêtage pour toi.

  3. #3
    Expert confirmé
    Avatar de Benjamin Delespierre
    Profil pro
    Développeur Web
    Inscrit en
    Février 2010
    Messages
    3 929
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2010
    Messages : 3 929
    Par défaut
    Je pense (mais c'est vrai que tu aurais pu le préciser) que skandaboy utilise PDO et PDOStatement. Son problème est l'utilisation de règles like dans des requêtes préparées...

    Je ne suis pas sûr que ce soit possible. Dans le pire des cas, tu ne prépares pas la requête (de toute façon avec deux clauses like la pseudo optimisation est rendue caduque) et tu utilise PDO::query.

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    en tout cas pour mysql c'est possible
    même si PDO_Mysql par défaut ne fait pas de requête préparées (même avec prepare)

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Citation Envoyé par skandaboy Voir le message
    si je fais un truc du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resultat->execute(array("%".$var1."%","%".$var2."%"));
    ça marche pas. Comment faire?
    Il faudrait décrire un peu mieux le problème.
    Est-ce qu'il y a un message d'erreur et si oui lequel?
    Est-ce que execute() renvoie true ou false?
    S'il renvoie true, est-ce que le problème est que les lignes de résultat sont différentes de ce à quoi tu t'attends?

  6. #6
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 78
    Par défaut
    bon j'ai trouvé une astuce. en fait je suis en train de faire un moteur de recherche pour mon site. Donc ce que je veux c récupérer les mots tapés par l'utilisateur et les mettre dans une req sql avec des LIKE par exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM annonce INNER JOIN vendeur ON annonce.idvendeur=vendeur.idvendeur WHERE titre LIKE :mot1 AND titre LIKE :mot2";
    bien sur le tout exécuté en tant que requete préparée(securité oblige). mon pb c'est que dans une req préparée on ne peut pas spécifier 2 vars différentes pour un m champ (ici titre) par exemple je ne crois pas qu'on puisse faire pour rechercher les 2 mots dans une chaine:

    $result->execute(ARRAY(
    ':titre'=>$mot1,
    ':titre'=>$mot2,));

    En supposant que mot1 et mot2 sont les mots récupérés par exemple.

    Mais en fait la solution était simple il suffit de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $resultat->execute(array("%$mot1%"."%$mot2%"));
    ma req sql devient :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT * FROM annonce INNER JOIN vendeur ON annonce.idvendeur=vendeur.idvendeur WHERE titre LIKE ?";
    ça marche comme ça. plus besoin de 2 clauses LIKE. Mais pourkoi je n'y ai pas pensé plus tot?!

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Mais ce n 'est pas la même chose que les 2 LIKE séparés.
    Par exemple si le titre est 'le bois fleuri' et que mot1=fleuri et mot2=bois, alors cette clause-là est vraie:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'le bois fleuri' LIKE  '%fleuri%' AND 'le bois fleuri' LIKE  '%bois%'
    alors que celle-là est fausse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'le bois fleuri' LIKE  '%fleuri%%bois%'

  8. #8
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 78
    Par défaut
    Ben comment kon fait alors?

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Par défaut
    fait du FULLTEXT (en MyISAM), sinon il faut rassembler les champs dans un seul et faire la recherche dessus

  10. #10
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 78
    Par défaut
    En fait j'aimerais faire des req indépendantes de la base. c'est pour ça que je préfère utiliser des LIKE.

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    Citation Envoyé par skandaboy Voir le message
    Ben comment kon fait alors?
    Moi il me semble que la requête que tu as postée au départ ainsi le bout de php (execute PDO) sont corrects et devraient fonctionner.
    C'est pourquoi je demandais quel est le problème. Message d'erreur? Résultat incorrect?

  12. #12
    Membre confirmé
    Inscrit en
    Mars 2007
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 78
    Par défaut
    Ben maintenant ça marche avec ma solution. Mais tu dis qu'il y a un pb. Alors c à toi de m'expliquer je pense.

    Je ne comprends pas trop qd tu dis que ma req est fausse ou que la tienne est vraie. Si un utilisateur tape "bois fleuri" ça marche avec ma solution. ça me renvoierra "bois fleuri" je pense j'ai essayé avec d'autres chaines avec plusieurs mots et tout a marché).

    Alors peus-tu m'expliquer ce que tu veux dire stp?

  13. #13
    Membre Expert
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    1 874
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 874
    Par défaut
    L'idée c'est qu'il n'y a pas de problème particulier à faire deux LIKE sur le même champ de table avec PDO. Tu dis que "ça ne marche pas" mais comme tu ne réponds pas quand je te demande quelle est l'erreur et que ma boule de cristal est en panne, je ne vois pas quoi dire de plus.

    Si ton problème est résolu tu cliques sur le bouton Résolu et on passe à autre chose.

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

Discussions similaires

  1. [MySQL] Problème requete SQL sur plusieurs tables
    Par Tiib_CD dans le forum Langage SQL
    Réponses: 30
    Dernier message: 21/12/2006, 16h52
  2. Requete SQL jointure plusieurs tables
    Par bibicha dans le forum Langage SQL
    Réponses: 1
    Dernier message: 31/08/2006, 17h38
  3. [VB6] Ecrire une requete SQL sur plusieurs lignes!
    Par big x dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 08/05/2006, 16h28
  4. Requete SQL avec une clause FROM variable
    Par aCe_GiK dans le forum Requêtes et SQL.
    Réponses: 8
    Dernier message: 11/04/2006, 13h45
  5. Ecrire une requete SQL sur plusieurs lignes
    Par PrinceMaster77 dans le forum ASP
    Réponses: 2
    Dernier message: 15/11/2004, 14h47

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