IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

Améliorer un système de recherche


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut Améliorer un système de recherche
    Bonjour à tous et à toutes,
    Je viens vers vous aujourd'hui pour savoir si il est possible de prioriser une colonne d'une table quand un mot est trouvé dedans.
    Je m'explique, j'ai un système de recherche sur un site de vente en ligne de cartouche pour imprimante qui fonctionne bien mais que je voudrais améliorer pour qu'il affiche moins de résultat.
    Je fait la recherche dans trois colonnes de la table produits (marque, modèle imprimante et référence de la cartouche)
    Voici mon problème : si le chercheur écrit "hp" ça va chercher dans les trois colonnes et afficher toutes les lignes ou il y a "hp" dedans car la marque est trouvée dans la colonne marque.
    Jusque la tout va bien, maintenant si le chercheur écrit "hp envy 4500" ça va toujours chercher dans les trois colonnes (marque, modèle imprimante et référence de la cartouche) et afficher toutes les lignes ou il y a "envy 4500" trouvé dans la colonne modèle imprimante et aussi hp trouvé dans la colonne marque mais moi je voudrais que la requête n'aille plus chercher dans la colonne des marques à partir du moment ou elle a trouvée quelque chose dans la colonne modèle d'imprimante et n'affiche que les lignes ou il y a "envy 4500".
    Est-ce possible ?

    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    <?php
    $check = array('produits' => array('marque', 'mod_imprimante', 'ref_origine'));
    //Connexion à la base de données
    include('connexion_ajax.php');
    $table = (isset($_GET['table']) ? htmlspecialchars($_GET['table']) : '');
    $marque = (isset($_GET['marque']) ? htmlspecialchars($_GET['marque']) : '');
    $mod_imprimante = (isset($_GET['imprimante']) ? htmlspecialchars($_GET['imprimante']) : '');
    $ref_origine = (isset($_GET['ref_origine']) ? htmlspecialchars($_GET['ref_origine']) : '');
    $search = (isset($_GET['search']) ? htmlspecialchars($_GET['search']) : '');
     
    if(isset($check[$table]) && in_array($mod_imprimante, $check[$table])){ //Vérification
    	if($table && $mod_imprimante && $search){
    		$search = strtolower(htmlspecialchars($search));
     
    		header("content-type: application/xml");
    		echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>";
    		echo '<suggests>';
     
    		$and = 'AND';
    		$or = 'OR';
    		$mots = explode(" ", $search); //séparation des mots
    		$nombre_mots = count ($mots); //comptage du nombre de mots
    		$valeur_requete = '';
    		//tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en incrémentant à chaque fois le nombre de mots
    		for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) 
    			{
    				$valeur_requete .= '' . $and .' '.$marque.' LIKE \'%'.$mots[$nombre_mots_boucle].'%\' 
    				' . $or .' '.$mod_imprimante.' LIKE \'%'.$mots[$nombre_mots_boucle].'%\'
    				' . $or .' '.$ref_origine.' LIKE \'%'.$mots[$nombre_mots_boucle].'%\'';
    			}
    		$valeur_requete = ltrim($valeur_requete,$and); //suppression de AND ou de OR au début de la boucle
    		$query_impr = $bdd_ajax->query('SELECT '.$mod_imprimante.' FROM '.$table.' WHERE aff_recherche = 1 AND ('.$valeur_requete.') GROUP BY '.$mod_imprimante.' ORDER BY '.$mod_imprimante.'');
    while($data_impr=$query_impr->fetch()) {
    			$string_field[$field_string]=strtolower(stripslashes($data_impr[$mod_imprimante]));
    				$affichage_field[$mod_imprimante] = ucwords($string_field[$field_string]," \t\r\n\f\v'");
    			echo '	<suggest>'.$affichage_field[$mod_imprimante].'</suggest>';
    		}
    		echo '</suggests>';
    		$query_impr->closeCursor();
    	}
    }
    ?>
    PS : j'ai essayé de faire une requête préparée mais la ça fonctionne plus lol
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
     
    <?php
    $query_impr = $bdd_ajax->prepare('SELECT '.$mod_imprimante.' FROM '.$table.' WHERE aff_recherche = :aff AND 
    		(mod_imprimante LIKE %:mod_imp% OR ref_origine LIKE %:ref_oem% OR marque LIKE %:marq%) 
    		GROUP BY mod_imprimante ORDER BY mod_imprimante');
    		for($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) 
    			{
    				$query_impr->bindValue('mod_imp', $search, PDO::PARAM_STR);
    				$query_impr->bindValue('ref_oem', $search, PDO::PARAM_STR);
    				$query_impr->bindValue('marq', $search, PDO::PARAM_STR);
    			}
     
    		$query_impr->bindValue('aff', 1, PDO::PARAM_INT);
    		try
    			{
    				$query_impr->execute();
    			}
    		catch ( Exception $e )
    			{
    				echo ''.$e->getMessage().'<br />';
    				echo ''.$e->getCode();
    				exit();
    			}
    ?>
    Merci d'avance pour votre aide.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 325
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 325
    Billets dans le blog
    17
    Par défaut
    Dans le principe tu pourrais faire un SELECT du LIKE => Ainsi tu sais d'où vient le résultat (champ valorisé 0 ou 1)

    Exemple simple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    $sql = <<<SQL
        SELECT ALL
            id, manufacturer, model, reference,
            manufacturer LIKE '%{$search}%' AS manufacturer_result, -- 0 si non trouvé, 1 si trouvé
            model LIKE '%{$search}%' AS model_result, -- 0 si non trouvé, 1 si trouvé
            reference LIKE '%{$search}%' AS reference_result -- 0 si non trouvé, 1 si trouvé
        FROM printers
        -- Les références trouvées sortiront en premier, puis les modèles, puis les fabricants
        ORDER BY reference_result DESC, model_result DESC, manufacturer_result DESC
        HAVING manufacturer_result = 1 OR model_result = 1 OR reference_result = 1
        SQL;
    Avec cette requête tu obtiens en premier les résultats dont la référence correspond, ensuite le modèle, puis le fabricant.

    PS : Il existe un index FULLTEXT MySQL qui pourrait t'intéresser, ce type d'index, allié à MATCH() facilite grandement les recherches => https://dev.mysql.com/doc/refman/8.0...xt-search.html

  3. #3
    Membre éclairé
    Homme Profil pro
    Educateur spécialisé
    Inscrit en
    Janvier 2012
    Messages
    238
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Educateur spécialisé
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2012
    Messages : 238
    Par défaut
    Merci pour ton aide seb,
    Je vais regarder tout ça.

Discussions similaires

  1. [Système][fichier] recherche de fichier dans tout le disque dur
    Par helonear dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 15/12/2010, 10h43
  2. [MySQL] Améliorer mon moteur de recherche
    Par younek dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 10/09/2008, 23h59
  3. Systéme de recherche vba
    Par akmer dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 08/08/2008, 17h59
  4. [Système] <pb> Système de recherche
    Par Joe-La-Boule dans le forum Langage
    Réponses: 5
    Dernier message: 14/07/2006, 13h20
  5. Réponses: 2
    Dernier message: 09/12/2005, 12h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo