pb requete

Invité
Invité n'ayant pas de compte PHPfrance

19 avr. 2007, 18:35

Bonjour,

j'essaye de construire un moteur de recherche de livres avec les champs suivants, tous optionnels:
-Titre
-Auteur
-Thèmes
-Mots-clés

Voici ma requete
$query =  "SELECT * FROM produits WHERE trash = 0";
$query .= " AND titreSousTitre LIKE '%" . trim($titre) . "%'";
$query .= " OR titreSousTitre LIKE '%" . trim($mots) . "%'";
$query .= " OR auteur LIKE '%" . trim($auteur) . "%'";
$query .= " OR auteur LIKE '%" . trim($motscles) . "%'";
$query .= " OR themes LIKE '%" . trim($motscles) . "%'";
$query .= " OR motsClef  LIKE '%" . trim($motscles) . "%'";
Cette requete me renvoie tous les résultats de ma base, quelque soit ce que je tape. D'ou ma question: comment construire une requete a partir d'un formulaire de recherche ou tous les champs sont optionnels?

Merci pour vos réponses.

Invité
Invité n'ayant pas de compte PHPfrance

19 avr. 2007, 18:53

une précision: tous les champs sont optionnels et la recherche mots clés se fait sur tous les champs.

Invité
Invité n'ayant pas de compte PHPfrance

19 avr. 2007, 20:30

en fait si je fais pointer la recherche sur tous les champs avec la meme valeur ($ici, $motscles) , ça marche :
$query =  "SELECT * FROM produits WHERE trash = 0";
$query .= " AND titre LIKE '%" . trim($mots) . "%'";
$query .= " OR auteur LIKE '%" . trim($mots) . "%'";
$query .= " OR themes LIKE '%" . trim($mots) . "%'";
$query .= " OR motsClef  LIKE '%" . trim($mots) . "%'";
$query .= " ORDER BY idRecord ASC";

Mais si je mets des valeurs différentes pour chaque champ, tous les résultats de la base sont affichés systématiquement, au lieu de ce que je demande:
$query =  "SELECT * FROM produits WHERE trash = 0";
$query .= " AND titreSousTitre LIKE '%" . trim($titre) . "%'";
$query .= " OR titreSousTitre LIKE '%" . trim($mots) . "%'";
$query .= " OR auteur LIKE '%" . trim($auteur) . "%'";
$query .= " OR themes LIKE '%" . trim($mots) . "%'";
$query .= " OR motsClef  LIKE '%" . trim($mots) . "%'";
$query .= " ORDER BY idRecord ASC";
Comment croiser les critères ?

Mammouth du PHP | 19672 Messages

20 avr. 2007, 08:19

Tu devrais peut-être utiliser des parenthèses pour regrouper tes clauses WHERE en deux catégories : celles qui doivent être vérifiées et celles optionnelles. Par exemple, si un auteur est indiqué, ça devrait être précédé d'un AND et non d'un OR.

Exemple :
$titre  = trim($titre);
$auteur = trim($auteur);
$mots   = trim($mots);
/* Doivent être vérifiées */
$clauses1 = array();
$clauses1[] = "trash = 0";
if(!empty($titre) || !empty($auteur))
{
    if(!empty($titre))
    {
        $clauses1[] = "titreSousTitre LIKE '%" . trim($titre) . "%'";
    }
    if(!empty($auteur))
    {
        $clauses1[] = "auteur LIKE '%" . trim($auteur) . "%'";
    }
}
$where1 = implode(" AND ", $clauses1);

/* Optionnelles */
$clauses2 = array();
if(!empty($mots))
{
    $clauses2[] = "titreSousTitre LIKE '%" . $mots . "%'";
    $clauses2[] = "themes LIKE '%" . $mots . "%'";
    $clauses2[] = "motsClef  LIKE '%" . $mots . "%'";
    $where2 = implode(" OR ", $clauses2);
}
$where = (isset($where2)) ? $where1 ." AND (". $where2 .")" : $where1;

$query =  "SELECT * FROM produits ".
          "WHERE ". $where ." ".
          "ORDER BY idRecord ASC";
Ce code va générer la requête suivante (J'ai mis des valeurs en dur pour les besoin de l'illustration) :

Code : Tout sélectionner

SELECT * FROM produits WHERE trash = 0 AND titreSousTitre LIKE '%misérables%' AND auteur LIKE '%Hugo%' AND ( titreSousTitre LIKE '%test%' OR themes LIKE '%test%' OR motsClef LIKE '%test%' ) ORDER BY idRecord ASC
Codez en pensant que celui qui maintiendra votre code est un psychopathe qui connait votre adresse :axe: