Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/03/2011, 17h18   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 74
Points : 11
Points : 11
Par défaut requete sql et plusieurs clauses LIKE

Bonjour,

Savez vous comment faire une requete du genre :
Code :
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 :
1
2
 
$resultat->execute(array("%".$var1."%","%".$var2."%"));
ça marche pas. Comment faire?
skandaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 12h29   #2
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
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 116
Points : 2 142
Points : 2 142
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.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 13h11   #3
Modérateur
 
Avatar de Benjamin Delespierre
 
Benjamin Delespierre
Développeur Web
Inscription : février 2010
Messages : 2 984
Détails du profil
Informations personnelles :
Nom : Benjamin Delespierre
Âge : 24
Localisation : France

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

Informations forums :
Inscription : février 2010
Messages : 2 984
Points : 5 014
Points : 5 014
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.
__________________
A la recherche d'un framework MVC facile a prendre en main ? Essayez Axiom
Nouveau: la référence d'Axiom est disponible sur GitHub (je la peaufine en ce moment même).

Un problème correctement identifié est à moitié résolu, évitez de poster l'intégralité de votre code avec pour seule explication "ça ne marche pas...".
Pour identifier correctement vos problèmes PHP, utilisez la gestion des erreurs et xdebug.

Les boutons et existent, servez-vous en
Benjamin Delespierre est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 21/03/2011, 13h36   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
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)
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 13h59   #5
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
Citation:
Envoyé par skandaboy Voir le message
si je fais un truc du genre :

Code :
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?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 21h29   #6
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 74
Points : 11
Points : 11
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 :
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 :
1
2
 
$resultat->execute(array("%$mot1%"."%$mot2%"));
ma req sql devient :

Code :
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?!
skandaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/03/2011, 22h35   #7
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
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 :
'le bois fleuri' LIKE  '%fleuri%' AND 'le bois fleuri' LIKE  '%bois%'
alors que celle-là est fausse:
Code :
'le bois fleuri' LIKE  '%fleuri%%bois%'
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 11h34   #8
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 74
Points : 11
Points : 11
Ben comment kon fait alors?
skandaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 11h47   #9
Modérateur
 
Inscription : septembre 2010
Messages : 7 101
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 101
Points : 8 465
Points : 8 465
fait du FULLTEXT (en MyISAM), sinon il faut rassembler les champs dans un seul et faire la recherche dessus
__________________
http://blog.stealth35.com/
stealth35 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 13h17   #10
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 74
Points : 11
Points : 11
En fait j'aimerais faire des req indépendantes de la base. c'est pour ça que je préfère utiliser des LIKE.
skandaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 15h50   #11
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
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?
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 16h40   #12
Candidat au titre de Membre du Club
 
Inscription : mars 2007
Messages : 74
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 74
Points : 11
Points : 11
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?
skandaboy est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/03/2011, 17h59   #13
Modérateur
 
Inscription : octobre 2008
Messages : 1 505
Détails du profil
Informations personnelles :
Localisation : France, Paris (Île de France)

Informations forums :
Inscription : octobre 2008
Messages : 1 505
Points : 2 034
Points : 2 034
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.
estofilo est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 20h17.


 
 
 
 
Partenaires

Hébergement Web