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 :

Fonction de Recherche comment afficher? [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut Fonction de Recherche comment afficher?
    bonjour a tous,

    Voila je souhaite integrer sur un site une fonction de recherche donc j'ai creer ma requete

    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
     
    //on recupere la valeur du champ de recherche
    $recherche=$_POST['recherche'];
    $recherche=htmlentities($recherche,ENT_QUOTES);
     
    $sql=("select * from integration where ref_int like'%$recherche%' OR titre_int like'%$recherche%' OR cat_int like'%$recherche%' OR fam_int like'%$recherche%' OR marque_int like'%$recherche%'
     
             UNION 
     
    	 select * from peripheriques where ref_per like'%$recherche%' OR titre_per like'%$recherche%' OR cat_per like'%$recherche%' OR fam_per like'%$recherche%' OR marque_per like'%$recherche%'
     
    	UNION
     
    	 select * from connectiques where ref_con like'%$recherche%' OR titre_con like'%$recherche%' OR cat_con like'%$recherche%' OR fam_con like'%$recherche%' OR marque_con like'%$recherche%'
     
    	UNION
     
    	select * from multimedia where ref_mul like'%$recherche%' OR titre_mul like'%$recherche%' OR cat_mul like'%$recherche%' OR fam_mul like'%$recherche%' OR marque_mul like'%$recherche%'
     
    	UNION
     
    	select * from consommables where ref_con like'%$recherche%' OR titre_con like'%$recherche%' OR cat_con like'%$recherche%' OR fam_con like'%$recherche%' OR marque_con like'%$recherche%'
     
    	UNION
     
    	select * from reseaux where ref_res like'%$recherche%' OR titre_res like'%$recherche%' OR cat_res like'%$recherche%' OR fam_res like'%$recherche%' OR marque_res like'%$recherche%'
     
    	UNION
     
    	select * from notebook where ref_not like'%$recherche%' OR titre_not like'%$recherche%' OR cat_not like'%$recherche%' OR fam_not like'%$recherche%' OR marque_not like'%$recherche%'");
     
    $result=mysql_query($sql);
    mais apres pour l'affichage je bute :

    Ex: Si je veux afficher les refences de integration je fais echo "".$row[ref_int].""; mais hélas dans la recherche ce n'ai pas le resultat voulu etant donné qu'il faut afficher tous les resultat de toutes les tables

    C'est un peu brouillon mon explication mais bon j'ai fais au mieu

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Je suis surpris que votre requête fonctionne! J'imagine que ces quatres tables ont le même nombre de champs?

    L'idéal serait de spécifier dans chacun de vos SELECT les champs à extraire pour s'assurer que tous soit bien ordonner...

    SELECT ID, NOM, ETC...

  3. #3
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par sim_mmm
    Je suis surpris que votre requête fonctionne! J'imagine que ces quatres tables ont le même nombre de champs?
    Qui y'a t-il de surprenant ?Ai je fais une erreur? Oui elles ont le meme nombre de champs



    Citation Envoyé par sim_mmm
    L'idéal serait de spécifier dans chacun de vos SELECT les champs à extraire pour s'assurer que tous soit bien ordonner...

    SELECT ID, NOM, ETC...
    Ca change quelque chose au niveau de la requete ou c'est juste pour la relecture?

    Voila j'ai specifier comme vous me l'aviez indiquez

    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
    <?
     
    //on recupere la valeur du champ de recherche
    $recherche=$_POST['recherche'];
    $recherche=htmlentities($recherche,ENT_QUOTES);
     
    $sql=("	SELECT ref_int,titre_int,cat_int,fam_int,marque_int 
    		FROM integration 
    		WHERE ref_int LIKE'%$recherche%' OR titre_int LIKE'%$recherche%' OR cat_int LIKE'%$recherche%' OR fam_int LIKE'%$recherche%' OR marque_int LIKE'%$recherche%'
    		 
             UNION 
    		 
    	 SELECT ref_per,titre_per,cat_per,fam_per,marque_per 
    	 FROM peripheriques 
    	 WHERE ref_per LIKE'%$recherche%' OR titre_per LIKE'%$recherche%' OR cat_per LIKE'%$recherche%' OR fam_per LIKE'%$recherche%' OR marque_per LIKE'%$recherche%'
    		 
    	UNION
    		 
    	 SELECT ref_con,titre_con,cat_con,fam_con,marque_con 
    	 FROM connectiques 
    	 WHERE ref_con LIKE'%$recherche%' OR titre_con LIKE'%$recherche%' OR cat_con LIKE'%$recherche%' OR fam_con LIKE'%$recherche%' OR marque_con LIKE'%$recherche%'
    		
    	UNION
    		
    	SELECT ref_mul,titre_mul,cat_mul,fam_mul,marque_mul 
    	FROM multimedia 
    	WHERE ref_mul LIKE'%$recherche%' OR titre_mul LIKE'%$recherche%' OR cat_mul LIKE'%$recherche%' OR fam_mul LIKE'%$recherche%' OR marque_mul LIKE'%$recherche%'
    		
    	UNION
    		
    	SELECT ref_con,titre_con,cat_con,fam_con,marque_con
    	FROM consommables 
    	WHERE ref_con LIKE'%$recherche%' OR titre_con LIKE'%$recherche%' OR cat_con LIKE'%$recherche%' OR fam_con LIKE'%$recherche%' OR marque_con LIKE'%$recherche%'
    		
    	UNION
    		
    	SELECT ref_res,titre_res,cat_res,fam_res,marque_res 
    	FROM reseaux 
    	WHERE ref_res LIKE'%$recherche%' OR titre_res LIKE'%$recherche%' OR cat_res LIKE'%$recherche%' OR fam_res LIKE'%$recherche%' OR marque_res LIKE'%$recherche%'
    		
    	UNION
    		
    	SELECT ref_not,titre_not,cat_not,fam_not,marque_not 
    	FROM notebook 
    	WHERE ref_not LIKE'%$recherche%' OR titre_not LIKE'%$recherche%' OR cat_not LIKE'%$recherche%' OR fam_not LIKE'%$recherche%' OR marque_not LIKE'%$recherche%'");
     
    $result=mysql_query($sql);
     
    ?>
    merci d'avance

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par silver59
    Ai je fais une erreur?
    A la vue de votre structure de table non.

    Sans m'égarer du sujet il n'aurait pas été plus simple d'utiliser une seule table avec une colonne type étant donnée que les 7 sont identiques?

    Dans ce cas pas nécessaire de spécifier les colonnes sauf si vous prévoyez ajouter des colonnes à certaines tables. Dès que les 7 tables n'auront plus le même nombre de colonne la requête va planter...

    Cela dit pour être honnête avec vous je me suis plus attarder sur la forme que le fond. Alors revenons à l'essentiel, je ne suis pas sure de comprendre votre question. En faisant $row[ref_int] vous afficher tous les éléments des 7 tables n'est-ce pas ce que vous voulez?

    N'oublier pas que dans le cas d'un union le nom de la colonne est déterminer par le premier SELECT.

    Donc vos référence réseau, notebook, etc.. se retrouverons dans la colonne nommé ref_int.

    Si vous voulez distinguer le type ajouter à chaque requête une colonne pour indiquer le type :

    SELECT *, 'RESEAU'
    UNION
    SELECT *, 'NOTEBOOK'
    UNION
    ...

  5. #5
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par sim_mmm
    A la vue de votre structure de table non.

    Sans m'égarer du sujet il n'aurait pas été plus simple d'utiliser une seule table avec une colonne type étant donnée que les 7 sont identiques?
    En y reflechissant oui c'est vrai qu'il aurai juste fallu rajouter une colonne pour determiner le type de produit ( integration , notebook etc.. ).
    Mais etant donné qu'il y a beaucoup d'enregistrement cela n'ai pas mieu justement de separé un peu ? ( relecture , acces plus rapide a la table etc..). Je donne des exemples comme ca je dis peu etre des betises mais c'est juste pour avoir des complement d'informations supplémentaires

    Citation Envoyé par sim_mmm
    En faisant $row[ref_int] vous afficher tous les éléments des 7 tables n'est-ce pas ce que vous voulez?
    Oui en fait je pensais qu'il fallais determiner toutes les reference , donc quand je faisais ma recherche je ne pensais pas qu'il faillais juste faire un $row[ref_int] pour afficher les reference meme ceux hors de la table integration c'est pour cela que je ne comprenais pas comment faire.

    Citation Envoyé par sim_mmm
    N'oublier pas que dans le cas d'un union le nom de la colonne est déterminer par le premier SELECT.
    Merci c'est une chose que j'ignorais donc forcement ca eclairie le probleme

    Citation Envoyé par sim_mmm
    Donc vos référence réseau, notebook, etc.. se retrouverons dans la colonne nommé ref_int.

    Si vous voulez distinguer le type ajouter à chaque requête une colonne pour indiquer le type :

    SELECT *, 'RESEAU'
    UNION
    SELECT *, 'NOTEBOOK'
    UNION
    ...
    Je pense avoir compris le probleme donc je vais essayer de tester avec vos conseils je pensent que ca devrai allez tous seul désormais

    Merci beaucoup , je vous tiens au courant de la situation

  6. #6
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    bon l'affichage fonctionne mais j'ai un petit souci ou du moins une interrogation

    lorsque j'affiche une image je fais comme ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ("<img src='images/miniature/integration/".$row['ref_int'].".jpg') title='".$row['titre_int']."' style='margin-left: 11px;' border='0'>");
    etant donné que les images sont séparé dans des dossier différent il ne m'affiche forcement que les image du dossier integration

    Donc est ce qu'il est possible d'ouvrir genre le dossier miniature , lister toute les image et ensuite affiche les image correspondantes a la recherche?

    Autre question lorsque je recherche un produit comment determiner si il viens de la table integration , notebook etc..?

    merci d'avance pour votre aide

  7. #7
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Pour une solution simple je vous conseil de rajouter un champ dans votre requêtes...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    SELECT *, 'integration' as type
    UNION
    SELECT *, 'reseau'
    UNION
    ...
    Ensuite

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ("<img src='images/miniature/$row[type]/".$row['ref_int'].".jpg') title='".$row['titre_int']."' style='margin-left: 11px;' border='0'>");

  8. #8
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    merci pour votre reponse interessante mais il y a un hic

    car pour definir l'alias il faudrai qu'un champ se nomme integration ,notebook etc??

    car si je met le AS comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ref_int,titre_int,cat_int,fam_int,marque_int AS dossier
    	 FROM integration
    Et qu'ensuite j'affiche les produits
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo ("<img src='images/miniature/".$row['dossier']."/".$row['ref_int'].".jpg') title='".$row['titre_int']."' style='margin-left: 11px;' border='0'>");
    Et bien le dossier qui devrai etre integration etc en fait est celui du texte tapé

    donc au lieu d'avoir

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src='images/miniature/integration' />
    J'obtiens ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <img src='images/miniature/valeur_du_champ_de_recherche' />
    Et si je nomme la table avec l'alias et que j'affiche comme precedemment il me dit que cette variable est indefini

    merci pour votre aide

  9. #9
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Citation Envoyé par silver59
    merci pour votre reponse interessante mais il y a un hic

    car pour definir l'alias il faudrai qu'un champ se nomme integration ,notebook etc??
    Non pas nécessaire d'avoir un champ supplémentaire dans les tables. Faîte le test dans PHPMyAdmin copier et coller cette requête et faîtes exécuter ensuite regarder le résultat de la dernière colonne. remarquer que integration est entre single quote.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT ref_int,titre_int,cat_int,fam_int, 'integration' AS dossier
    FROM integration

  10. #10
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    ah ok je comprend maintenant et effectivement maintenant ca marche donc l'affichage fonctionne et j'ai reussi par la meme occasion a afficher la descripton des produits grace a votre aide donc c'est parfais

    je vous remercie beaucoup pour m'avoir aider dans ma requete

    @bientot peu etre

    EDIT: Juste une derniere question , pour limiter ma recherche a un certain nombre de produit par page j''utilise cette requete ( qui fonctionne tres bien lorsqu'il n'y a qu'une table )

    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
    $retour = mysql_query("
    SELECT count(*) as nb_messages
    FROM integration 
    WHERE ref_int LIKE'%$recherche%' OR titre_int LIKE'%$recherche%' OR cat_int LIKE'%$recherche%' OR fam_int LIKE'%$recherche%' OR marque_int LIKE'%$recherche%'
     
    UNION 
     
    SELECT count(*) as nb_messages
    FROM peripheriques 
    WHERE ref_per LIKE'%$recherche%' OR titre_per LIKE'%$recherche%' OR cat_per LIKE'%$recherche%' OR fam_per LIKE'%$recherche%' OR marque_per LIKE'%$recherche%' 
     
    UNION
     
    SELECT count(*) as nb_messages
    FROM connectiques 
    WHERE ref_con LIKE'%$recherche%' OR titre_con LIKE'%$recherche%' OR cat_con LIKE'%$recherche%' OR fam_con LIKE'%$recherche%' OR marque_con LIKE'%$recherche%' 
     
    UNION
     
    SELECT count(*) as nb_messages
    FROM multimedia 
    WHERE ref_mul LIKE'%$recherche%' OR titre_mul LIKE'%$recherche%' OR cat_mul LIKE'%$recherche%' OR fam_mul LIKE'%$recherche%' OR marque_mul LIKE'%$recherche%' 
     
    UNION
     
    SELECT count(*) as nb_messages
    FROM consommables 
    WHERE ref_con LIKE'%$recherche%' OR titre_con LIKE'%$recherche%' OR cat_con LIKE'%$recherche%' OR fam_con LIKE'%$recherche%' OR marque_con LIKE'%$recherche%' 
     
    UNION
     
    SELECT count(*) as nb_messages
    FROM reseaux 
    WHERE ref_res LIKE'%$recherche%' OR titre_res LIKE'%$recherche%' OR cat_res LIKE'%$recherche%' OR fam_res LIKE'%$recherche%' OR marque_res LIKE'%$recherche%' 
     
    UNION
     
    SELECT count(*) as nb_messages
    FROM notebook 
    WHERE ref_not LIKE'%$recherche%' OR titre_not LIKE'%$recherche%' OR cat_not LIKE'%$recherche%' OR fam_not LIKE'%$recherche%' OR marque_not LIKE'%$recherche%' ");
     
    $donnees = mysql_fetch_array($retour);
    $totalDesMessages = $donnees['nb_messages'];
    echo"retour $totalDesMessages ";
    Le souci est que a l'affichage il ne m'affiche que le resultat de la 1ere table :



    Donc quand je fais mon echo de la requete il m'affiche 70 ( ceci est fais avec un exemple au pif bien sur ) donc est t-il possible de faire l'addition de tous les champs? ou bien compter le nombre de produits afficher en fonction de la recherche ? je ne sais pas quelle solution serai la mieu adapater

    merci beaucoup pour votre aide et votre patience

  11. #11
    Membre régulier
    Profil pro
    Inscrit en
    Novembre 2003
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2003
    Messages : 77
    Points : 89
    Points
    89
    Par défaut
    Que l'on me corrige si je me trompe mais de souvenir on ne peut utiliser une clause GROUP BY pour unir plusieurs requête d'un union.

    MAIS il existe la méthode mysql_num_row() de php qui permet d'obtenir le nombre d'enregistrement d'une requête SQL.

    Essayer avec votre requête initiale d'affichage de faire mysql_num_row($retour);

  12. #12
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    Citation Envoyé par sim_mmm
    MAIS il existe la méthode mysql_num_row() de php qui permet d'obtenir le nombre d'enregistrement d'une requête SQL.
    Ah j'avais pas pensai a celle la moi j'avais fais mysql_fetch_rows et ca ne correspondait pas a ma demande , je pense que celle ci devrai fonctionner je vous tiens au courant de la situation

    grand merci encore une fois

  13. #13
    Membre du Club
    Inscrit en
    Mars 2007
    Messages
    75
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 75
    Points : 61
    Points
    61
    Par défaut
    voila merci de votre aide ca marche nikel desormais

    probleme resolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 20/12/2014, 08h10
  2. [VxiR2] Comment afficher une valeur en fonction du max d'une autre valeur
    Par mp.giraud dans le forum Deski
    Réponses: 3
    Dernier message: 06/05/2009, 16h58
  3. Réponses: 4
    Dernier message: 04/11/2008, 10h39
  4. Réponses: 4
    Dernier message: 09/01/2007, 21h50
  5. [VBA-E] Fonction rechercher et afficher le résultat dans l'UF
    Par Viper7 dans le forum Macros et VBA Excel
    Réponses: 13
    Dernier message: 25/08/2006, 11h17

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