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 :

Moteur de recherche (séparer champs) [Fait] [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut Moteur de recherche (séparer champs)
    Bonjour

    J'ai fait un petit moteur de recherche (PHP/MySQL)

    Dans ma requête de traitement j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select description from fichier where description LIKE saisie_utilisateur;
    Cela me retournes un résultat correct lorsque le champ saisie est identique au champ.

    Je voulais savoir ou on pourrait modifier afin qu'il prennes en compte d'autres mots.


    Ex : Description dans la table -> Reglement v2.

    et donc saisir "v2" pour avoir le résultat.



    Cordialement,

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Tu est sur la bonne voie. Avec LIKE il faut utiliser % ou _
    % pour n'importe quel nombre de charactère
    _ un seul caractère.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     ...where description LIKE %saisie_utilisateur%;
    te permet de chercher v2 et de trouver tout ce qui contient cela.

    Pour plus d'information
    http://dev.mysql.com/doc/refman/5.0/...functions.html

  3. #3
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    Ok.

    En fait , j'ai déja essayé ça, mais le truc c'est que ça prend que le premier mot en compte

  4. #4
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    Oui ça prends que le premier mot en compte , il y a surement un truc qui recupère les champs entre les espaces :
    lingo" "version" "1

    recherche de "lingo" , "version" et "1".

    like mot1 and like mot2 and like mot3 ?

    Mais après comment gérer le nombre de mots saisis ?

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Hum si j'ai bien compris tu veux faire une recherche sur chaque mot que l'utilisateur à entré.

    Sans trop me casser la tête, tu peut faire un truc genre explode d'espace vide sur ta chaine de recherche et ensuite créer ta clause where dans une boucle. C'est d'ailleur ce qe tu semble proposer.

    J'ai quelques truc à finir ensuite je poste un peu de code qui devrait aider.

  6. #6
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    Oui j'ai vu la fonction explode , je penses que je vais l'utiliser ,
    maintenant il faut que je trouves un moyen de parcourir tout le tableau et que pour chaque enregistrement qu'il fasse un LIKE champ%.


    MAJ 1 : J'ai trouvé comment afficher chaque entrée du tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for ($i=0; $i<count($var) ;$i++)
    {echo $var[$i] }
    Maintenant comment mettre ça dans la requête ?
    where for(...) ?

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Voici le petit truc

    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
     
    <?php
     
    //ton code pour exlposer la recherche
     
    $query="SELECT description FROM tatab WHERE";
    for ($i=0; $i<count($var) ;$i++)
    {
       $query=$query." description LIKE %".$var[$i]."%";
        if($i+1<count($var))//si par dernier element
        {
             $query=$query." OR ";
         }
     
    }
    $result=mysql_query($query);
    ?>

  8. #8
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    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
    { $connexion=mysql_connect('localhost','-','-') or die ('impossible de se connecter, veuillez ré-essayer');
    				$db = mysql_select_db('intranet', $connexion) or die ('La base de données ne peut pas être sélectionnée');
     
    				if($connexion) 
    				{	
     
    					$query="SELECT description FROM fichier WHERE";
    					for ($i=0; $i<count($CHAMP) ;$i++)
    					{
    					$query=$query." description LIKE %".$CHAMP[$i]."%";
    				    if($i+1<count($CHAMP))//si par dernier element
    					{
    			         $query=$query." OR ";
    					}
    					}
     
    				}
    				$result=mysql_query($query);
    				if(mysql_query($result) >= 1)
    				{	
    				echo ok;
    				}
    				else
    				{	
    				echo annule;
    				}
    			}

    J'ai à touts les coups "annulé" , peut-être le problème viendrait de la :
    if(mysql_query($result) >= 1)

  9. #9
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    $result contient un resultset et il ne peut pas être traité comme un tableau ordinaire. Pour savoir combien d'enregistrement ont été trouvés il faut utilisé mysql_num_rows.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mysql_num_rows($result)>=1)

  10. #10
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    Je voulais quand c'est Ok , être redirigé vers une page (header) et sur cette page, afficher le nombre de résultats et les afficher dans un tableau .

    C'est un peu beaucoup , c'est vrai

    Donc je ne peux pas utlilser my_nums_rows.... si ?

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if(mysql_num_rows($result)>=1)//recherche donne un resultat
    {
    //il faut envoyer l'information à la prochaine page
     
    //Attention les variables session sont limité à 2 meg 
    $_SESSION['resultRecherche']=$result;
    header (Locate:http://www.tapge.com);
    }
    Bon j'explique.
    1 - Pour envoyer les résultats à une autre page on passe par une variable session. Je ne conseille pas d'utiliser ce moyen car l'ensemble des variables session est limité à deux meg et si ta recherche renvoie beaucoup de résultats tu peux perdre des données ( je parle par expérience ) . Je conseillerais plutôt de faire tout le traitement dans une même page. Si jamais c'est impossible, fait au mieu pour controller le nombre de retour ( si un utilisateur rentre "a" comme recherche, combien d'enregistrements il trouve ? ).

    2- Utilise la fonction header pour rediriger l'utilisateur. La syntaxe que je donne n'est probablement pas exacte, je fais sa rapidement de mémoire, cherche php header() sur google tu devrais trouver ce qu'il te faut.

  12. #12
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    if(mysql_num_rows($result) =< 1)

    J'ai mis comme ça et ça fonctionnes. Bizarre , ça doit pas être l'inverse normalement ?




  13. #13
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Je n'utiliserais pas de cookies pour stocker des résultas de recherche mysql avec like, pour les raisons données plus haut ( controle des retours ).

    mysql_num_rows, sa renvoie le nombre d'enregistrement trouvé par la requête. Si c'est 1 alors ton code =< devrait être ok si c'est plus sa devrait être faux.

  14. #14
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    Ok , maintenant le test final sur la page de résultat :

    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
    $db = mysql_connect('localhost', '--', '--');
    				// on sélectionne la base
    				mysql_select_db('intranet',$db);
    				// on crée la requête SQL
    				$sql="SELECT description FROM fichier WHERE";
    					for ($i=0; $i<count($CHAMP) ;$i++)
    					{
    					$sql=$sql." description LIKE %".$CHAMP[$i]."%";
     
     
    				// on envoie la requête
    				$req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    				$total = mysql_num_rows($req);
    				// on fait une boucle qui va faire un tour pour chaque enregistrement
    				while($data = mysql_fetch_array($req)) 
    				{
    					// on affiche les informations de l'enregistrement en cours
    					echo '<tr bgcolor="white">';
    						echo '<td>'.$data["id_fichier"].'</td>';
    						echo '<td>'.$data["nom_fichier"].'</td>';
    						echo '<td>'.$data["description"].'</td>';
    						echo '<td>'.$data["date"].'</td>';
    						echo  '<td> <a href="'.$data["lien_fichier"].'" >    Telechargez!     </a> </td>';
    					echo '</tr>';
    				}
    				// on ferme la connexion à mysql
    				mysql_close();
    C'est Ok , tu penses ?

  15. #15
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    Non hélas , il y a un problème pour l'affichage

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Le problème c'est quoi exactement ? Ta syntaxe semble bonne, quoi qu'il commence à être tard j'ai peut être manqué quelque chose.

    Bon de toute façon pour ce soir c'est tout, si tu encore des problèmes je regarde sa demain ,sinon .

    edit : La seul chose que j'ai vue c'est que tu n'ouvrais pas de balise <table> pour ton tableau, mais j'imagine que tu le fais avant ?

  17. #17
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    L'erreur vient de l'affichage.
    On doit bien utiliser un mysql_fetch_array ?


    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
    $db = mysql_connect('localhost', '--', '--');
    // on sélectionne la base
    mysql_select_db('intranet',$db);
    // on crée la requête SQL
    $sql="SELECT description FROM fichier WHERE";
    for ($i=0; $i<count($CHAMP) ;$i++)
    {
    $sql=$sql." description LIKE %".$CHAMP[$i]."%";
    }					
     
    // on envoie la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    $total = mysql_num_rows($req);
    // on fait une boucle qui va faire un tour pour chaque enregistrement
    while($data = mysql_fetch_array($req)) 
    {
    // on affiche les informations de l'enregistrement en cours
    echo '<tr bgcolor="white">';
    echo '<td>'.$data["id_fichier"].'</td>';
    echo '<td>'.$data["nom_fichier"].'</td>';
    echo '<td>'.$data["description"].'</td>';
    echo '<td>'.$data["date"].'</td>';
    echo  '<td> <a href="'.$data["lien_fichier"].'" >    Telechargez!     </a> </td>';
    echo '</tr>';
    }
    // on ferme la connexion à mysql
    mysql_close();

    PS : le table s'ouvre bien avant.

    Peut-être qu'on doit mettre id_fichier , nom_fichier dans le select aussi .

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    C'est en plein sa !
    Sa m'étonne que je sois passé à coté hier, je devais vraiment être crevé.

    Donc oui dans ton select tu doit indiquer tout les champs que tu veux pouvoir lire dans ton recordset. Tu peut aussi faire un select * pour avoir tout les champs de chaque enregistrements.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT description, id_ficher, truc , chose FROM latable WHERE ...

  19. #19
    Membre éclairé
    Inscrit en
    Février 2007
    Messages
    271
    Détails du profil
    Informations forums :
    Inscription : Février 2007
    Messages : 271
    Par défaut
    C'est pas ça...

    Bon je vais faire un petit récapitulatif , j'espère que ça va m'aider aussi.

    J'ai d'abord le formulaire ou l'utlisateur saisie des mots. Ce formulaire pointe vers un traitement php (php 1) :
    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
    <?php 
    $SAISIE=$_POST['nom']; //RECUPERATION DE LA SAISIE DU USER
    setcookie("saisie",$SAISIE);
    $CHAMP=explode(" ",$SAISIE);
     
    $connexion=mysql_connect('localhost','-','-') or die ('impossible de se connecter, veuillez ré-essayer');
    $db = mysql_select_db('intranet', $connexion) or die ('La base de données ne peut pas être sélectionnée');
    if($connexion)
    {	
    	$query="SELECT description FROM fichier WHERE";
    	for ($i=0; $i<count($CHAMP) ;$i++)
    	{
    	$query=$query." description LIKE ".$CHAMP[$i]."%";  
    	}
     
    }
    	$result=mysql_query($query);
    	if(mysql_query($result) =< 1)
    	{	
    	header("location:intranet2.php?page=RechercheDocDesc1"); //AU MOINS 1 MOT CONNU
    	}
    	else
    	{	
    	header("location:intranet2.php?page=RechercheDocDesc2"); //ERREUR
    	}
    ?>
    PS 1 : Il doit y avoir un problème lors du
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mysql_query($result) =< 1)
    parce que qu'importe la saisie , il me renvoit sur Desc1 meme si le mot n'existe pas
    ----

    Ensuite viens la page Desc1 qui affiche le nombre et les résultats disponibles :
    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
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
     
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
     
    <body link="blue" vlink="#006633" >
     
    <p align="center" > <u> Gestion des documents </u><br> <br>  
     
    Recherche par <b> description </b> 	<br> <br>
     
    <?php 
    $SAISIE=$_COOKIE["saisie"];
    $CHAMP=explode(" ",$SAISIE);
    for ($i=0; $i<count($CHAMP) ;$i++)
    {
    echo "<br>".$CHAMP[$i];
    }
     
    $COUNT=count($CHAMP);
    echo "<br>";
    echo ""; echo "<br>";
     
     
    echo "Pour la description saisie : <b>".$SAISIE."</b> , vous avez <b>".$COUNT. "</b> résultat(s) dans le tableau ci dessous :" ."<br><br>" ;
     
    ?>
     
    <table border="2" bgcolor="#339933" align="center" cellspacing="2" cellpadding="3" height="1%" width="65%"> 
    			<tr bgcolor="white">
    				<th>Description</th> 
    			</tr>
    <?php
    $connexion=mysql_connect('localhost','-','-') or die ('impossible de se connecter, veuillez ré-essayer');
    $db = mysql_select_db('intranet', $connexion) or die ('La base de données ne peut pas être sélectionnée');
     
    if($connexion) 
    {	
    // on se connecte à MySQL
    $db = mysql_connect('localhost', 'root', '19031986');
    // on sélectionne la base
    mysql_select_db('intranet',$db);
    // on crée la requête SQL
    $sql="SELECT description FROM fichier WHERE";
    for ($i=0; $i<count($CHAMP) ;$i++)
    {
    $sql=$sql." description LIKE ".$CHAMP[$i]."%";
    }
    // on envoie la requête
    $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
    $total = mysql_num_rows($req);
    // on fait une boucle qui va faire un tour pour chaque enregistrement
    while($data = mysql_fetch_array($req)) 
    {
    // on affiche les informations de l'enregistrement en cours
    echo '<tr bgcolor="white">';
    echo '<td>'.$data["description"].'</td>';
    echo '</tr>';
    }
    // on ferme la connexion à mysql
    mysql_close();
    }
    ?>	
    </table>
    </p>
    </body>
    </html>
    PS 2 : Affichage ->
    Erreur SQL !
    SELECT description FROM fichier WHERE description LIKE description_fichier%
    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '%' at line
    1

  20. #20
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    47
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 47
    Par défaut
    Tu sembles avoir beaucoup de difficulté pour une page qui n'est pas si difficile que sa. Tu devrais peut être revoir quelques tutoriel sur mysql et php, plutôt que de te casser la tête à aller par essaie-erreur.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mysql_query($result) =< 1)
    Ce bout de code ne fait aucun sens. mysql_query ne renvoie pas un nombre !
    http://fr.php.net/mysql_query


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(mysql_num_rows($result)>=1)//si nombre de resultat > ou = à 1
    Pour ta 2e erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    for ($i=0; $i<count($CHAMP) ;$i++)
    {
    $sql=$sql." description LIKE ".$CHAMP[$i]."%";
    }
    Ca ne peux pas fonctionner, retourne voir la boucle que je t'ai donner en exemple auparavant. Il faut ajouter l'opérateur OR et vérifier si il s'agit de ton dernier enregistrement.

    La tu risques d'avoir un truc genre SELECT champ FROM latable WHERE description LIKE mot1% description LIKE
    mot2%.

    De plus tu veux probablement mettre un % avant le champ aussi.

    demov1
    si tu cherche v1 tu ne le trouvera pas avec LIKE v1% mais tu le trouveras avec LIKE %v1%.

    D'après ton erreur ton cookie semble vide également. Fait un echo de $SAISIE et au besoin un var_dump($CHAMP) pour vérifier le contenu des variables

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/04/2012, 17h39
  2. Recherche moteur wiki utilisant des champs imposés
    Par pixelb dans le forum Services
    Réponses: 0
    Dernier message: 03/01/2011, 17h40
  3. [MySQL] Moteur de recherche qui recherche un champ dans toute ma base de données
    Par mademoizel dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 20/12/2010, 13h28
  4. [MySQL] Moteur de recherche multi critére - Probléme affichage si champs vide
    Par karpe dans le forum PHP & Base de données
    Réponses: 0
    Dernier message: 28/02/2010, 21h59
  5. [HTML] Champ formulaire moteur de recherche
    Par lelectronique.com dans le forum Balisage (X)HTML et validation W3C
    Réponses: 8
    Dernier message: 21/07/2008, 20h39

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