Probleme recuperation sql multicriteres dans module de recherche .

Eléphant du PHP | 80 Messages

05 juin 2008, 23:41

Bonjour à tous, j'ai une table dans ma base de donnée pour mon site d'annonces de dons d'objets http://publicannonces.com qui contient notemment les champs "titre" et "intitule" ; titre contient donc le titre de l'annonces, et intitule contient soit "donne" soit "demande" ces données ne peuvent se nommer que par ces deux mots car ils sont choisis au prealable dans une liste deroulante ...

Ma requete qui doit afficher uniquement les dons :

Code : Tout sélectionner

mysql_query("SELECT * FROM don WHERE intitule='donne' AND titre LIKE '$rens%' OR titre LIKE '%$rens' OR titre LIKE '%$rens%'");
Et celle qui n'est censée afficher que les emandes :

Code : Tout sélectionner

mysql_query("SELECT * FROM don WHERE intitule='demande' AND titre LIKE '$rens%' OR titre LIKE '%$rens' OR titre LIKE '%$rens%'");
je vous precise que $rens=$_POST['renseignements']; mais cela n'a pas d'importance dans mon probleme je pense.

Mon probleme c'est que les deux requetes affichent tous les resultats, quand je recherche dans les intitule='donne' sa me met aussi les resultats des intitule='demande' et vis-versa O_o donc j'avoue ne pas comprendre la, si quelqu'un peut m'aider sa serait sympa ;)

Merci par avance ;)

ps : pour tester : http://publicannonces.com/recherche.php

d0m
Mammouth du PHP | 1141 Messages

06 juin 2008, 08:06

salut,

à mon avis cela vient de la priorité des AND et OR dans ta requete : les AND ont priorités sur les OR
Ta requête est lu comme ceci :

selectionner les lignes de don
qui ont :
soit intitule='donne' et titre like '$rens%'
soit titre LIKE '%$rens'
soit titre LIKE '%$rens%'


il faut parentheser correctement la clause where.
Modifié en dernier par d0m le 06 juin 2008, 08:08, modifié 1 fois.

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

06 juin 2008, 08:08

3 choses :
- les 3 conditions sur le champ titre sont redondantes. En fait, la 3e englobe les deux premières. Donc, tu peux les retirer.
- Le SELECT * est à proscrire. Indique clairement les champs que tu veux récupérer.
- N'oublie pas d'extraire les variables de la chaîne de caractères.

Est-ce que cela fonctionne mieux avec ceci ?
$req_don = "SELECT *
            FROM   don
            WHERE  intitule='donne'
              AND  titre LIKE '%".$rens."%'";

$req_dem = "SELECT *
            FROM   don
            WHERE  intitule='demande'
              AND  titre LIKE '%".$rens."%'";

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 juin 2008, 08:24

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

Administrateur PHPfrance
Administrateur PHPfrance | 11457 Messages

06 juin 2008, 08:29

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".
L'y était pas déjà ??? :oops:

Eléphant du PHP | 80 Messages

06 juin 2008, 09:09

3 choses :
- les 3 conditions sur le champ titre sont redondantes. En fait, la 3e englobe les deux premières. Donc, tu peux les retirer.
- Le SELECT * est à proscrire. Indique clairement les champs que tu veux récupérer.
- N'oublie pas d'extraire les variables de la chaîne de caractères.

Est-ce que cela fonctionne mieux avec ceci ?
$req_don = "SELECT *
            FROM   don
            WHERE  intitule='donne'
              AND  titre LIKE '%".$rens."%'";

$req_dem = "SELECT *
            FROM   don
            WHERE  intitule='demande'
              AND  titre LIKE '%".$rens."%'";
J'avais deja essayé, mais cela ne marchait pas, par contre j'ai trouvé la solution, il suffisait de regrouper les titre like "..."... par ( et ) hihi tout simple :

Code : Tout sélectionner

SELECT * FROM don WHERE intitule='donne' AND ( titre LIKE '$rens%' OR titre LIKE '%$rens' OR titre LIKE '%$rens%' ) et SELECT * FROM don WHERE intitule='demande' AND ( titre LIKE '$rens%' OR titre LIKE '%$rens' OR titre LIKE '%$rens%' )
Voilou, et sa marche tres bien ;) http://publicannonces.com/recherche.php pour tester

[Note : ce message a été posté de manière anonyme avant d'être réattribué à son auteur]

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

06 juin 2008, 09:35

Modération :
Afin d'obtenir plus de réponses, le sujet est déplacé dans le forum "SQL & Bases de données".
L'y était pas déjà ??? :oops:
Nan, il était dans "Autres" ;)
En plus, il était signalé :lol:
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer