Page 1 sur 1

moteur de recherche sur plusieurs champs d'une table

Posté : 03 avr. 2010, 10:43
par MF-M
Bonjour a tous,

Voila petit souci sur un moteur de recherche que j'ai trouver sur la toile (sur le site du zero)
Ce moteur de recherche fonctionne trés bien mais j'aimerais l'améliorer

Je m'explique
la recherche s'effectue QUE sur une seule colonne, et j'aimerais si possible faire une recherche sur plusieurs colonnes de la même table

Voivi la structure de ma table :

CREATE TABLE `vin` (
`id` int(11) NOT NULL auto_increment,
`origine` varchar(50) NOT NULL,
`nom` varchar(50) NOT NULL,
`domaine` varchar(50) NOT NULL,
`region` varchar(50) NOT NULL,
`appellation` varchar(50) NOT NULL,
`cepage` varchar(50) NOT NULL,
`detail_cepage` longtext NOT NULL,
`couleur` varchar(50) NOT NULL,
`millesime` decimal(4,0) NOT NULL,
`date_achat` date NOT NULL,
`quantite` decimal(3,0) NOT NULL,
`prix` decimal(6,2) NOT NULL,
`note` varchar(5) NOT NULL,
`date_conso` date NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=6 ;

--
-- Contenu de la table `vin`
--

INSERT INTO `vin` (`id`, `origine`, `nom`, `domaine`, `region`, `appellation`, `cepage`, `detail_cepage`, `couleur`, `millesime`, `date_achat`, `quantite`, `prix`, `note`, `date_conso`) VALUES
(1, 'france', 'château l étoile de viaud', '', 'bordeaux', 'lalande de pomerol', '', '', 'rouge', '2008', '0000-00-00', '0', '0.00', '3', '0000-00-00'),
(2, 'france', 'toto', '', 'bordeaux', 'bordeaux', '', '', 'rouge', '2009', '0000-00-00', '2', '0.00', '2', '0000-00-00'),
(3, 'france', 'tata', '', 'alsace', 'bergerac', '', '', 'rosé', '2008', '0000-00-00', '1', '100.00', '1', '0000-00-00'),
(4, 'france', 'titi', '', 'rhone', 'coteaux du lyonnais', '', '', 'blanc', '2001', '0000-00-00', '0', '150.50', '3', '0000-00-00'),
(5, 'france', 'tutu', '', 'bordeaux', 'bordeaux', '', '', 'rouge', '2002', '0000-00-00', '6', '200.00', '0', '0000-00-00');

actuellement je fais la recherche sur le nom du vin et les vins disponible (si $qte et different de 0)
j'aimerai faire une recherche sur plusieurs champs exemple (nom, region, appellation, couleur, millesime)

J'ai essayé avec AND OR mais sans succès dès que je coche la case disponibilité, je me retrouve avec aucun resultat

voici le code :
<?php
    Connect_mySql();
    if (isset($_POST['rechercher'])) {
        $recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables
        $mode = mysql_real_escape_string(htmlspecialchars($_POST['mode']));
        
        if (isset($_POST['qte'])) { // si on a coché la case
            $qte = "AND quantite <> '0'";
        }
        else { // si on ne l'a pas cochée
            $qte = '';
        }
        
        if ($mode == "tous_les_mots") {
            $and_ou_or = 'AND'; // on utilisera AND dans la boucle
        }
        else {
            $and_ou_or = 'OR'; // on utilisera OR dans la boucle
        }
        
        if ($mode == "expression_exacte") { // si le mode de recherche est par expression exacte
            $selection_recherche = mysql_query("SELECT * FROM vin WHERE nom LIKE '%$recherche%' $qte ORDER BY id ASC");
        }
        else { //si le mode de recherche n'est pas par expression exacte
            $mots = explode(" ", $recherche); //séparation des mots
            $nombre_mots = count($mots); //compte le nombre de mots
            $valeur_requete = '';            
            for ($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) { // tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
                $valeur_requete .= '' . $and_ou_or . ' nom LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; // modification de la variable $valeur_requete
            }
            $valeur_requete = ltrim($valeur_requete, $and_ou_or); // suppression de AND ou de OR au début de la boucle
            $selection_recherche = mysql_query("SELECT * FROM vin WHERE $valeur_requete $qte ORDER BY id ASC"); // requête avec le résultat de la boucle dedans
        }
        $nombre_resultats = mysql_num_rows($selection_recherche); // compte le nombre d'entrées sélectionnées par la recherche
        
        if ($nombre_resultats == 0) { // s'il n'y a pas de résultat
?>     
    <br />
    <div id="form">
        <form>
        <fieldset>    
        <legend>R&eacute;sultat de la recherche : <font color="#FF0000"><b>aucun resultat.</b></font></legend>
        <br />
            <table width="100%" border="0" cellspacing="1" cellpadding="1">            
                <tr>
                    <td height="25">
                        <input type="button" value="retour" onclick="document.location.href = '<?php echo $_SERVER['PHP_SELF'];?>?mod=1';" >
                    </td>
                </tr>    
            </table>
        </fieldset>
        </form>
    </div>
<?php
        }
        else { //il y a au moins un résultat
    
    $couleur[0]="#dae0d2";
    $couleur[1]="#ddeeff";
    $i=0;
    
?>
    <div id="form">
        <form action="<?php echo $_SERVER['PHP_SELF'];?>?mod=6&task=dropVin&idVin=<?php echo $_GET['idVin']; ?>" method="post">
        <input type="hidden" name="idVin" value="<?php echo $_GET['idVin']; ?>" />
        <fieldset>    
        <legend>R&eacute;sultat de la recherche : <font color="#0000FF"><b><?php echo $nombre_resultats; ?></b></font> vin(s) trouv&eacute;(s).</legend>
        <br />
        <table width="100%" border="0" cellspacing="1" cellpadding="1">
            <tr bgcolor="#ffcc66">
                <td width="3%" height="20" align="center">
                    &nbsp;
                </td>                            
                <td width="28%" align="center">
                    <b>nom</b>
                </td>
                <td width="15%" align="center">
                    <b>r&eacute;gion</b>
                </td>                            
                <td width="15%" align="center">
                    <b>appellation</b>
                </td>
                <td width="7%" align="center">
                    <b>couleur</b>
                </td>
                <td width="7%" align="center">
                    <b>mill&eacute;sime</b>
                </td>
                <td width="5%" align="center">
                    <b>qt&eacute;</b>
                </td>
            </tr>
<?php
            while ($resultats = mysql_fetch_array($selection_recherche)) { // boucle affichant les résultats
?>          
            <tr bgcolor = <?php echo $couleur[($i%2)]; ?> ></i>    
                <td align="center">
                    <a href="index.php?mod=6&task=detail&idVin=<?php echo $resultats['id']; ?>" target="_self">
                    <img src="./img/info.png" title="d&eacute;tail" border="0" width="32" heigth="32" />
                    </a> 
                </td>
                <td>                
                    <i>&nbsp;<?php echo strtoupper($resultats['nom']); ?></i> 
                </td>
                <td>                
                    <i>&nbsp;<?php echo ucwords($resultats['region']); ?></i> 
                </td>
                <td>                
                    <i>&nbsp;<?php echo ucwords($resultats['appellation']); ?></i> 
                </td>
                <td align="center">                
                    <i><?php echo $resultats['couleur']; ?></i> 
                </td>                
                <td align="center">                
                    <i><?php echo $resultats['millesime']; ?></i> 
                </td>
                <td>
                    <table width="100%" border="0">
                        <tr>
                            <td width="50%" align="right">
                                <i><?php echo $resultats['quantite']; ?></i>&nbsp;
                            </td>
                            <td width="50%" align="left">
                                <img src="./img/bouteille_rouge.png" border="0" width="10" height="32" />
                            </td>
                        </tr>
                    </table>
                </td>
<?php            
            $i++;
            }
?>
                </tr>
                <tr>    
                    <td height="27" valign="bottom" colspan="5">
                        <input type="button" value="nouvelle recherche" onclick="document.location.href = '<?php echo $_SERVER['PHP_SELF'];?>?mod=1';" >
                    </td>
                </tr>
            </table>
<?php
        }
    }
    else { // si on n'a pas validé le formulaire, on l'affiche
?>
    </div>
    <br />
    <div id="form">
        <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?mod=1">
        <fieldset>
        <legend>Rechercher un vin</legend>
        <br />
        <table width="100%" border="0" cellspacing="3" cellpadding="0">
            <tr>
                <td width="20%" height="25">
                    Recherche par mot
                </td>
                <td width="80%">
                    <input type="text" name="recherche" size="50" onkeyup="this.value=this.value.toLowerCase()" />
                </td>
            </tr>
            <tr>   
                <td height="25">
                    Recherche par
                </td>
                <td>
                    <select name="mode" style="width: 335px;">
                    <option value="tous_les_mots">tous les mots</option>                    
                    <option value="expression_exacte">mot exacte</option>
                    <option value="un_mot">au moins un mot</option>
                    </select>
                </td>
            </tr>
            <tr> 
                <td width="20%" height="25">
                    Uniquement les vins disponible
                </td>
                <td>
                    <input name="qte" type="checkbox" />
                </td>            
            </tr>  
            <tr> 
                <td height="25" colspan="2">
                    <input type="submit" name="rechercher" value="lance le recherche" />
                </td>
            </tr>
        </table>
        </fieldset>
        </form>             
    </div>
    
<?php
    }
    mysql_close(); // déconnexion de la bdd
?>
merci pour votre aide

Re: moteur de recherche sur plusieurs champs d'une table

Posté : 03 avr. 2010, 10:47
par MaximusCMS
Salut , ta recherche porte sur la colonne 'nom'

comme ceci
 nom LIKE '%$recherche%'
un simple ajout de colonne et l'affaire est dans le sac, un peu comme ceci
 ( nom LIKE '%$recherche%' OR region LIKE '%$recherche%' )
j'ai pas détaillé ton code, mais l'idée est autour de ceci

Re: moteur de recherche sur plusieurs champs d'une table

Posté : 03 avr. 2010, 13:11
par MF-M
Merci MaximusCMS pour ta réponse mais cela ne fonctionne pas (j'ai déja tenté cette piste)

Si je devais rajouter des champs ca serais a niveau de :
for ($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) { // tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
                $valeur_requete .= '' . $and_ou_or . ' nom LIKE \'%' . $mots[$nombre_mots_boucle] . '%\ AND region LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; // modification de la variable $valeur_requete
            }
ou
for ($nombre_mots_boucle = 0; $nombre_mots_boucle < $nombre_mots; $nombre_mots_boucle++) { // tant que le nombre de mots de la recherche est supérieur à celui de la boucle, on continue en augmentant le nombre de mots de 1 à chaque fois
                $valeur_requete .= '' . $and_ou_or . ' nom LIKE \'%' . $mots[$nombre_mots_boucle] . '%\ OR region LIKE \'%' . $mots[$nombre_mots_boucle] . '%\''; // modification de la variable $valeur_requete
            }

La effectivement j'ai un resultat sur le nom du bvin ou la region
mais si je sélectionne ma disponibilité, je me retrouve avec aucun resultat

Re: moteur de recherche sur plusieurs champs d'une table

Posté : 03 avr. 2010, 14:08
par stealth35
t'es en myisam utilise MACTH avec FULLTEXT
http://dev.mysql.com/doc/refman/5.0/fr/ ... earch.html

Re: moteur de recherche sur plusieurs champs d'une table

Posté : 04 avr. 2010, 07:39
par MF-M
Bonjour stealth35

J'ai passer une bonne partie de la nuit a essayer de resoudre mon souci
J'ai pu creer la la table avec FULLTEXT

CREATE TABLE `vin` (
`id` int(11) NOT NULL auto_increment,
`origine` varchar(50) NOT NULL,
`nom` varchar(50) NOT NULL,
`domaine` varchar(50) NOT NULL,
`region` varchar(50) NOT NULL,
`appellation` varchar(50) NOT NULL,
`cepage` varchar(50) NOT NULL,
`detail_cepage` longtext NOT NULL,
`couleur` varchar(50) NOT NULL,
`millesime` decimal(4,0) NOT NULL,
`date_achat` date NOT NULL,
`quantite` decimal(3,0) NOT NULL,
`prix` decimal(6,2) NOT NULL,
`note` varchar(5) NOT NULL,
`date_conso` date NOT NULL,
PRIMARY KEY (`id`),
FULLTEXT KEY `nom` (`nom`,`region`,`appellation`,`couleur`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1 AUTO_INCREMENT=11 ;

--
-- Contenu de la table `vin`
--

INSERT INTO `vin` (`id`, `origine`, `nom`, `domaine`, `region`, `appellation`, `cepage`, `detail_cepage`, `couleur`, `millesime`, `date_achat`, `quantite`, `prix`, `note`, `date_conso`) VALUES
(6, 'france', 'toto', '', 'bordeaux', 'bordeaux', '', '', 'blanc', '2009', '0000-00-00', '0', '0.00', '2', '0000-00-00'),
(7, 'france', 'tata', '', 'champagne', 'champagne', '', '', 'blanc', '2008', '0000-00-00', '3', '100.00', '3', '0000-00-00'),
(8, 'france', 'titi', '', 'jura', 'côtes du jura', '', '', 'rouge', '2006', '0000-00-00', '0', '150.00', '3', '0000-00-00'),
(9, 'france', 'tutu', '', 'bordeaux', 'gigondas', '', '', 'rouge', '2001', '0000-00-00', '6', '20.00', '?', '0000-00-00'),
(10, 'italie', 'tete', '', 'rhone', 'bonnes mares', '', '', 'rosé', '2001', '0000-00-00', '6', '0.00', '?', '0000-00-00');

J'ai créé une requete apres multiple essai : ne marche pas
SELECT * FROM vin WHERE MATCH (nom,region,appellation,couleur) AGAINST ('$recherche') $qte ORDER BY id ASC
J'aimerai juste faire une recherche sur la table vin dans tout les champs (y compris decimal) avec une option (case a coché) sur la disponibilité (l'option "mot exacte" pas besoin)
Le code est peut etre a revoir
merci d'avance



et je ne sais pas ou la placer

Re: moteur de recherche sur plusieurs champs d'une table

Posté : 04 avr. 2010, 09:30
par MF-M
Bonjour a tous

Aprés plusieurs essais j'y suis enfin arrivé OUF
<?php
    Connect_mySql();
    if (isset($_POST['rechercher'])) {
        $recherche = mysql_real_escape_string(htmlspecialchars($_POST['recherche'])); //sécurisation des variables
        
        if (isset($_POST['qte'])) { // si on a coché la case
            $qte = "AND quantite <> '0'";
        }
        else { // si on ne l'a pas cochée
            $qte = '';
        }
        
        $valeur_requete = '';            
        $selection_recherche = mysql_query("SELECT * FROM vin WHERE MATCH (nom,region,appellation,couleur) AGAINST ('$recherche') $qte ORDER BY id ASC");
        $nombre_resultats = mysql_num_rows($selection_recherche);
        
        if ($nombre_resultats == 0) { // s'il n'y a pas de résultat
?>     
    <br />
    <div id="form">
        <form>
        <fieldset>    
        <legend>R&eacute;sultat de la recherche : <font color="#FF0000"><b>aucun resultat.</b></font></legend>
        <br />
            <table width="100%" border="0" cellspacing="1" cellpadding="1">            
                <tr>
                    <td height="25">
                        <input type="button" value="retour" onclick="document.location.href = '<?php echo $_SERVER['PHP_SELF'];?>?mod=1';" >
                    </td>
                </tr>    
            </table>
        </fieldset>
        </form>
    </div>
<?php
        }
        else { //il y a au moins un résultat
    
    $couleur[0]="#dae0d2";
    $couleur[1]="#ddeeff";
    $i=0;
    
?>
    <div id="form">
        <form action="<?php echo $_SERVER['PHP_SELF'];?>?mod=6&task=dropVin&idVin=<?php echo $_GET['idVin']; ?>" method="post">
        <input type="hidden" name="idVin" value="<?php echo $_GET['idVin']; ?>" />
        <fieldset>    
        <legend>R&eacute;sultat de la recherche : <font color="#0000FF"><b><?php echo $nombre_resultats; ?></b></font> vin(s) trouv&eacute;(s).</legend>
        <br />
        <table width="100%" border="0" cellspacing="1" cellpadding="1">
            <tr bgcolor="#ffcc66">
                <td width="3%" height="20" align="center">
                    &nbsp;
                </td>                            
                <td width="28%" align="center">
                    <b>nom</b>
                </td>
                <td width="15%" align="center">
                    <b>r&eacute;gion</b>
                </td>                            
                <td width="15%" align="center">
                    <b>appellation</b>
                </td>
                <td width="7%" align="center">
                    <b>couleur</b>
                </td>
                <td width="7%" align="center">
                    <b>mill&eacute;sime</b>
                </td>
                <td width="5%" align="center">
                    <b>qt&eacute;</b>
                </td>
            </tr>
<?php
            while ($resultats = mysql_fetch_array($selection_recherche)) { // boucle affichant les résultats
?>          
            <tr bgcolor = <?php echo $couleur[($i%2)]; ?> ></i>    
                <td align="center">
                    <a href="index.php?mod=6&task=detail&idVin=<?php echo $resultats['id']; ?>" target="_self">
                    <img src="./img/info.png" title="d&eacute;tail" border="0" width="32" heigth="32" />
                    </a> 
                </td>
                <td>                
                    <i>&nbsp;<?php echo strtoupper($resultats['nom']); ?></i> 
                </td>
                <td>                
                    <i>&nbsp;<?php echo ucwords($resultats['region']); ?></i> 
                </td>
                <td>                
                    <i>&nbsp;<?php echo ucwords($resultats['appellation']); ?></i> 
                </td>
                <td align="center">                
                    <i><?php echo $resultats['couleur']; ?></i> 
                </td>                
                <td align="center">                
                    <i><?php echo $resultats['millesime']; ?></i> 
                </td>
                <td>
                    <table width="100%" border="0">
                        <tr>
                            <td width="50%" align="right">
                                <i><?php echo $resultats['quantite']; ?></i>&nbsp;
                            </td>
                            <td width="50%" align="left">
                                <img src="./img/bouteille_rouge.png" border="0" width="10" height="32" />
                            </td>
                        </tr>
                    </table>
                </td>
<?php            
            $i++;
            }
?>
                </tr>
                <tr>    
                    <td height="27" valign="bottom" colspan="5">
                        <input type="button" value="nouvelle recherche" onclick="document.location.href = '<?php echo $_SERVER['PHP_SELF'];?>?mod=1';" >
                    </td>
                </tr>
            </table>
<?php
        }
    }
    else { // si on n'a pas validé le formulaire, on l'affiche
?>
    </div>
    <br />
    <div id="form">
        <form method="post" action="<?php echo $_SERVER['PHP_SELF'];?>?mod=1">
        <fieldset>
        <legend>Rechercher un vin</legend>
        <br />
        <table width="100%" border="0" cellspacing="3" cellpadding="0">
            <tr>
                <td width="20%" height="25">
                    Recherche par mot
                </td>
                <td width="80%">
                    <input type="text" name="recherche" size="50" onkeyup="this.value=this.value.toLowerCase()" />
                </td>
            </tr>
            <tr> 
                <td width="20%" height="25">
                    Uniquement les vins disponible
                </td>
                <td>
                    <input name="qte" type="checkbox" />
                </td>            
            </tr>  
            <tr> 
                <td height="25" colspan="2">
                    <input type="submit" name="rechercher" value="lance le recherche" />
                </td>
            </tr>
        </table>
        </fieldset>
        </form>             
    </div>
    
<?php
    }
    mysql_close(); // déconnexion de la bdd
?>
merci a tous et merci a toi stealth35 pour la piste FULLTEXT