[Problème]Recherche sur deux champs d'une même table

Eléphanteau du PHP | 10 Messages

21 mai 2008, 14:51

Bonjour,

J'ai parcouru un peu le forum mais n'ai pas trouvé ce que je cherchais, je me permets donc de demander de l'aide à la communauté PHP, en espérant qu'une bonne âme voudra bien m'aider...

J'ai fait avec un ami un moteur de recherche bibliographique dans une base de données. J'ai un problème avec l'une des options de mon moteur de recherche.

J'aimerais rechercher une information dans deux champs différents d'une même table. Voici le code qui pose problème:

Code : Tout sélectionner

if ($choix == "auteur") { $sql = "SELECT DISTINCT * FROM ma_table WHERE auteur LIKE '%$motsclef%' OR auteursimple LIKE '%$motsclefs%'"; if ($methode == "OR" && $nbmots > 1) { $sql = "SELECT DISTINCT * FROM ma_table WHERE auteur LIKE '%$mots[0]%' OR auteursimple LIKE '%$mots[0]%'"; for ($i=1; $i<$nbmots; $i++) { $sql .=" OR auteur LIKE '%$mots[$i]%' OR auteursimple LIKE '%$mots[$i]%'"; } } }
Les recherches marchent (pas d'erreur de syntaxe ou autre), mais me retournent toutes les références de la table, ce qui est passablement gênant, vous en conviendrez.

Le même type de recherche sur d'autres champs fonctionnent sans problème. Exemple

Code : Tout sélectionner

if ($choix == "titre") { $sql = "SELECT * FROM ma_table WHERE titre LIKE '%$motsclef%' OR intitre LIKE '%$motsclef%'"; if ($methode == "OR" && $nbmots > 1) { $sql = "SELECT * FROM ma_table WHERE titre LIKE '%$mots[0]%' OR intitre LIKE '%$mots[0]%'"; for ($i=1; $i<$nbmots; $i++) { $sql .=" or titre like '%$mots[$i]%' or intitre like '%$mots[$i]%'"; } } }
SGBD : MySQL 5.0.45

Ma table:

Code : Tout sélectionner

CREATE TABLE `ma_table` ( `id` mediumint(9) NOT NULL auto_increment, `anneebull` text NOT NULL, `numbull` text NOT NULL, `auteur` text NOT NULL, `auteursimple` text NOT NULL, `annee` text NOT NULL, `titre` text NOT NULL, `inauteurs` text NOT NULL, `intitre` text NOT NULL, `collection` text NOT NULL, `ville` text NOT NULL, `pages` text NOT NULL, `cr` text NOT NULL, `resume` text NOT NULL, PRIMARY KEY (`id`) ) TYPE=MyISAM AUTO_INCREMENT=1351 ;
Donc ma question? Pourquoi est-ce que le premie code me retourne tous les enregistrements, et comment faire pour qu'il me retourne uniquement les enregistrements demandés dans le formulaire de recherche?

Merci d'avance aux bonnes âmes qui passeraient par ici

Philam

Eléphant du PHP | 174 Messages

21 mai 2008, 15:32

Bonjour.

Si ton deuxième extrait est fonctionnel, je serais tentée de chercher du côté des conditions de ta requête :
if ($choix    == "auteur")
{
    $sql = "SELECT DISTINCT * FROM ma_table WHERE auteur LIKE '%$motsclef%' OR auteursimple LIKE %$motsclefs%'";
    if ($methode == "OR" && $nbmots > 1)
    {
        $sql = "SELECT DISTINCT * FROM ma_table WHERE auteur LIKE '%$mots[0]%' OR auteursimple LIKE '%$mots[0]%'";
        for ($i=1; $i<$nbmots; $i++)
        {
            $sql .=" OR auteur LIKE '%$mots[$i]%' OR auteursimple LIKE '%$mots[$i]%'";
        }

    }
}
Le premier $motsclef ne comporte pas de "s".
Par conséquent, soit le premier, soit le deuxième est vide et LIKE '%%' ben ça choisit tout ^^

NB 1 : Sinon au passage une petite convention : lorsque tu donnes un nom à une variable qui est composé de deux noms réels (ou plus, ici mots et clés pour le terme mots-cles) le second mot (et les suivants) commencent toujours par une majuscule (motsCle).
Bon c'est juste une convention, pas une obligation mais dans la mesure où le code n'est pas commenté, c'est mieux.

NB2 : En parlant de commentaire, il existe désormais des vérificateurs qui ne valident pas les scripts s'ils ne comportent pas 30% de commentaires (avis à ceux qui font des BTS en informatique, notamment en Info Gestion, nos profs les utilisaient pour pondérer nos notes :s)
"Il vaut mieux avoir du luxe dans ses sentiments que sur ses habits, je ne crains, moi, le mépris de personne" Honoré De Balzac.
"On s'étonne trop de ce que l'on voit rarement et trop peu de ce que l'on voit chaque jour" Mme de Genlis
"L'absence diminue les médiocres passions et augmente les grandes comme le vent éteint les bougies et allume le feu" La RocheFoucauld
"People have hope because they can't see Death standing behind them" (anonymous)
"Of all the things I've lost, I miss my brain the most" (from a fanfic)

Eléphanteau du PHP | 10 Messages

21 mai 2008, 16:47

Tu es une génie, ça marche!

Je t'en suis éternellement reconnaissant

Et merci pour les conseils!

Philam

Modérateur PHPfrance
Modérateur PHPfrance | 6373 Messages

21 mai 2008, 17:08

C'est pour ça qu'il faut toujours tester d'abord sa requête directement dans MySQL (via phpMyAdmin par exmeple) et afficher le SQL généré par PHP pour débugger.


Merci de tagger le sujet en Résolu.