tutoriaux de moteur de recherche multicritères

bibi85
Invité n'ayant pas de compte PHPfrance

30 sept. 2006, 09:05

bonjour,
j'essaye de faire un petit moteur de recherche (3 critères) qui offre donc 7 combinaisons différentes, mais il ne fonctionne pas ! qqun peut-il me dire où je peux trouver un exemple ?
merci d'avance pour votre aide !

Mammouth du PHP | 19672 Messages

30 sept. 2006, 09:43

Tu pourrais peut-être nous exposer le problème plus précisément. "ça ne fonctionne pas", ce n'est pas d'une utilité considérable pour obtenir de l'aide :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Eléphanteau du PHP | 46 Messages

30 sept. 2006, 10:53

bonjour,
j'essaye de faire un petit moteur de recherche (3 critères) qui offre donc 7 combinaisons différentes, mais il ne fonctionne pas ! qqun peut-il me dire où je peux trouver un exemple ?
merci d'avance pour votre aide !
Bonjour
T'as trois critères ,la solution c'est de créer des chaines de caractères et de les concaténer ensuite dans ta requête ,je te donne un exemple :

Pour le premier critère ,appelant le critere1

if ($critere1=="") $chaine="";
else $chaine=" AND taTable.nomDuCritere1=".$critere1;


// Ensuite dans ta requête 
$req= "SELECT * FROM taTable,... WHERE 1 AND $chaine";

//Donc ici Si $critere1 est rempli tu obtiens une requête comme celle la
//SELECT * FROM taTable WHERE 1 AND valeurDuCritere1
//sinon SELECT * FROM taTable Where  1

Voila , Normalement ça marchera ,dans le Cas d'un OR tu utilise "0 OR"

Eléphanteau du PHP | 25 Messages

01 oct. 2006, 10:17

merci pour ta réponse. une question : à quoi crorrespond 1 après WHERE ?

Mammouth du PHP | 19672 Messages

01 oct. 2006, 10:38

C'est une astuce : il faut traduire par "WHERE 1 = 1" et dans ce cas, ce sera toujours vrai. Mon avis personnel : on utilise pas ce genre d'astuce, ça sort de phpMyAdmin qui utilise ce truc et c'est d'une utilité que je trouve des plus douteuses :-k
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

01 oct. 2006, 11:54

Je partage l'avis de Cyrano.. c'est uniquement de la bidouille pour ne pas s'embêter à gérer les cas WHERE / AND, mais personnellement je ne trouve pas ça très rigoureux... Surtout qu'il suffit de faire un tableau avec ses différentes conditions et de faire un implode() avec la chaine "AND" pour obtenir, simplement, une requête sql propre :
$cond = array();
if ($critere1!="") 
  $cond[] = "taTable.nomDuCritere1=".$critere1; 
...

$sql = "SELECT ... FROM ... ";
if(count($cond) > 0)
  $sql.= " WHERE " . implode(" AND ", $cond);

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 oct. 2006, 12:07

Pour ma part, je suis partagé. :|

Je suis très sensible à l'élégance de la solution proposée par Ryle
(solution que je ne manquerai pas d'adopter à l'avenir...) :merci:
mais je défends tout de même la légitimité de l'astuce précédemment évoquée.
//
$req = "SELECT champs FROM table WHERE 1=1";
if ($val_reference1) $req .= " AND champ1 = ".$val_reference1;
if ($val_reference2) $req .= " AND champ2 = ".$val_reference2;
// ...
L'astuce consistant à indiquer une condition toujours vérifiée dans la clause WHERE
pour ensuite y ajouter les éventuelles clauses AND ou OR
est en effet préconisée par M. Oracle himself ! :!: (Jean-Hubert, de son prénom)

C'est une astuce, oui. Mais pas une bidouille. :evil:

Certes, elle est moins élégante que celle proposée par Ryle (je le répête, mais c'est parce que je t'aime bien) :lol:
mais elle implique moins le développement dans un langage externe (ici, PHP)
et peut se construire entièrement en SQL, indépendamment du langage de dev utilisé...

Mammouth du PHP | 19672 Messages

01 oct. 2006, 12:19

En fait, le WHERE 1 = 1 n'a d'intérêt que si on doit prévoir une construction dynamique de clauses supplémentaires.

Quant à la manière de le faire, je préfère personnellement celle décrite par Ryle que j'utilise moi-même et privilégie.

L'autre méthode est certes valide, mais de mon point de vue personnel est "moins propre".

Et si je voulais jouer les "méticuleurs de mouches" (*) j'ajouterais que le WHERE 1 = 1 va en fait demander à MySQL (ou tout autre SGBD) de vérifier une condition supplémentaire : même si on connaît d'avance la réponse, il n'en demeure pas moins qu'on fait travailler le SGBD sur la vérification de cette clause. Alors ce n'est certainement pas mesurable comme effet (ou alors à l'échelle de la nano-seconde et encore...), mais c'est tout de même une perte de temps qui, multiplié par un nombre important de requêtes sur l'ensemble de l'application, peut aboutir à terme à prendre des secondes entières... :-k

(*) Demandez la traduction à Albat :langue:
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 oct. 2006, 12:36

le WHERE 1 = 1 va en fait demander à MySQL (ou tout autre SGBD)
de vérifier une condition supplémentaire. On est d'accord.

Et aussi que ça prendra un pouième de seconde. Donc négligeable.

mais...

ce pouième de seconde n'est-il pas tout de même inférieur
au temps de traitement du serveur PHP pour compiler le code de Ryle ?
Or, on sait que, autant que possible, il vaut mieux faire bosser MySQL que PHP, non ?

Mon avis est que WHERE 1=1 est plus vite interprété par MySQL
que la définition et la gestion de l'array[] et du implode() par PHP.

Moralité :
Si quelqu'un veut faire un benchmark sur 100000000 occurrences
pour vérifier qu'on arrive bien à 0,0000000000546 s d'écart... :lol:
Vous avez compris ce qu'est un "méticuleur de mouches", maintenant ? :langue:

Eléphanteau du PHP | 25 Messages

01 oct. 2006, 13:43

Merci à tous pour vos réponses. J'ai finalement réussi à le faire fonctionner avec "empty", mais je vais tester chacune des solutions proposées.

je trouve que ce forum est très sympa et que vous apportez des réponses compréhensibles pour une débutante comme moi.

merci beaucoup pour ce que vous faites ! :P

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 oct. 2006, 13:53

Merci pour tes sympathiques compliments.

Et n'oublie de cliquer sur le bouton "Mettre Résolu" en haut à gauche de ta page. ;)

Mammouth du PHP | 19672 Messages

01 oct. 2006, 14:04

Et n'oublie de cliquer sur le bouton "Mettre Résolu" en haut à gauche de ta page. ;)
Elle peut pas, elle a posté le sujet original en "invité", je l'ai fait moi-même ;)
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe:

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

01 oct. 2006, 14:11

Mea culpa... :oops: