[SQL] Utilisation de LIKE : AND ou OR ?

Fermé
Jean-Guy Badiane Messages postés 646 Date d'inscription mardi 3 mars 2009 Statut Membre Dernière intervention 31 mars 2020 - Modifié par Jean-Guy Badiane le 2/06/2010 à 10:27
Jean-Guy Badiane Messages postés 646 Date d'inscription mardi 3 mars 2009 Statut Membre Dernière intervention 31 mars 2020 - 3 juin 2010 à 15:13
Bonjour la France.
Auriez-vous la gentillesse de venir en aide à un ambianceur en détresse ?
Je vous remercie d'avance, chers consommateurs.
Vous êtes beaux, vous êtes superbes ! Voici mon problème...

Je m'entraîne un peu sur ma nouvelle base toute fraîche ! :-)

Je possède un formulaire de recherche, qui comporte trois champs.
(le type de voiture, le nombre de places et la présence d'airbags)

Toutes ces informations sont sérialisées dans un champ "data" de ma table "voiture".

Exemple d'une berline à 4 places qui possède des airbags.
s:11:"typeVoiture";s:7:"berline";s:8:"nbPlaces";s:1:"4";s:6:"airbag";s:3:"oui";


Lorsqu'un utilisateur entre des informations dans la page, puis clique sur le bouton Rechercher, je les récupère en PHP et j'effectue une requête SQL dans ma base. Cependant, vu que ces informations sont sérialisées et présentes dans un champ unique, j'utilise le mot-clé LIKE.

SELECT data FROM 'voiture' WHERE data LIKE '%;s:11:\"typeVoiture\";s:".$lengthType.":\"".$typeVoiture."\"%' OR data LIKE '%;s:8:\"nbPlaces\";s:".$lengthPlaces.":\"".$nombrePlaces."\"%' OR data LIKE '%;s:6:\"airbag\";s:".$lengthAirbag.":\"".$presenceAirbag."\"%';


Avec le mot-clé OR, j'ai un gros problème. Si l'utilisateur remplit tous les champs, j'obtiens toutes les berlines, toutes les voitures qui possèdent quatre places et toutes les voitures qui ont des airbags. Si l'utilisateur ne remplit pas l'un des champs, j'obtiens aussi les fiches où l'information n'est pas renseignée.


SELECT data FROM 'voiture' WHERE data LIKE '%;s:11:\"typeVoiture\";s:".$lengthType.":\"".$typeVoiture."\"%' AND data LIKE '%;s:8:\"nbPlaces\";s:".$lengthPlaces.":\"".$nombrePlaces."\"%' AND data LIKE '%;s:6:\"airbag\";s:".$lengthAirbag.":\"".$presenceAirbag."\"%';


Avec le mot-clé AND, idem. Si l'utilisateur ne remplit pas l'un des champs, le résultat est faussé. Il recherche une berline à 4 places, mais ne précise pas s'il souhaite ou non des airbags. La requête ne le précise donc pas, mais la fiche contient l'information, et n'est donc pas sélectionnée.


Quelle est la requête correcte pour faire fonctionner le moteur de recherche ?

Une nouvelle fois, merci.
Au plaisir de vous rencontrer dans votre supermarché préféré. ;-)))

Jean-Guy Badiane.



Le saumon, ça voyage mal dans le mocassin.
A voir également:

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
Modifié par Reivax962 le 2/06/2010 à 12:00
Bonjour,

Pour résoudre ton problème, je te conseille de générer ta requête en fonction des champs remplis, dans le code php.

Par exemple :
// Bouts de requêtes pour chaque champ
$dataLikeType = ($typeVoiture != "") ? "data LIKE '%;s:11:\"typeVoiture\";s:$lengthType:\"$typeVoiture\"%'" : ""; 

$dataLikePlace = ($nombrePlaces != "") ? "data LIKE '%;s:8:\"nbPlaces\";s:$lengthPlaces:\"$nombrePlaces\"%'" : ""; 

$dataLikeAirbag = ($presenceAirbag != "") ? "data LIKE '%;s:6:\"airbag\";s:$lengthAirbag:\"$presenceAirbag\"%'" : ""; 


// Rajout des AND si nécessaire
if ($dataLikeType != "" && $dataLikePlace != "") $dataLikePlace = "AND ".$dataLikePlace; 

if ($dataLikeType.$dataLikePlace != "" && $dataLikeAirbag != "") $dataLikeAirbag = "AND ".$dataLikeAirbag; 


// Construction de la clause WHERE
$clauseWhere = ($dataLikeType.$dataLikePlace.$dataLikeAirbag != "") ? "WHERE $dataLikeType $dataLikePlace $dataLikeAirbag" : ""; 


// La requête finale
$requeteSQL = "SELECT data FROM 'voiture' $clauseWhere"; 


En espérant que tu n'aies pas trop de champs dans ton formulaire, sinon il faudrait adapter un peu pour ne pas trop complexifier.

Xavier
2
Jean-Guy Badiane Messages postés 646 Date d'inscription mardi 3 mars 2009 Statut Membre Dernière intervention 31 mars 2020 7
Modifié par Jean-Guy Badiane le 3/06/2010 à 15:14
Merci mon cher Xavier, c'est exactement ce qu'il me fallait.

Si ça te branche, rejoins le Café des Membres et demande au barman une bonne limonade ou un jus d'orange bien frais de ma part.

Bien que tu ne sois pas un p'tit nouveau, j'ai remarqué que tu n'avais jamais mis le pied dans ce lieu sympathique et chatoyant. On te réservera, j'en suis sûr, un accueil digne d'un monarque ou de Régine.

Encore merci, ton conseil m'a bien aidé...

A bientôt sur le forum, cher ami. ;-)))


Jean-Guy, une touche de joie pour vos pots de licenciements.
Le saumon, ça voyage mal dans le mocassin.
1