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 :

Formulaire de Recherche [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Par défaut Formulaire de Recherche
    Bonjour,

    J'ai créer un formulaire de recherche très simple..

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     <?php
     
    echo'
      
    <form method="post" action="Rechercherep.php"/>
        <input type="text" name="recherche"/> 
        <input type="submit" value="Rechercher un utilisateur"/>
    </form>';
     
      ?>
    Pour la page rechercherep j'ai procédé comme il suit :

    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    $recherche=$_POST['recherche'];
     
    $req="select * from ordinateur, utilisateur
    where ordinateur.IdUser=utilisateur.IdUser and RAM like '%$recherche%'
    or CPU like '%$recherche%'
    or DD like '%$recherche%' or Login like '%$recherche%' or NomPoste like '%$recherche%'";
    			$query = mysql_query($req, $connexion) or die("erreur".mysql_error());
    			$lgreq = mysql_fetch_array($query);
     
    if(empty($_POST['recherche']))
    			{
    			echo'
    	<div id="background">
    			<div id="page">
    			<div class="header">
    			<div class="footer">
    			<div class="body"><div id="sidebar"> <a href="index.html"><img id="logo" src="images/logo.gif" with="154" height="74" alt="" title=""/></a>
    				<ul class="navigation">
    					<li><a  href="index.html">Accueil</a></li>
    					<li class="active"><a href="gestion.php" >Gestion du Parc</a></li>
    					<li><a href="about.php">A propos</a></li>
    					<li class="last"><a href="contact.php">Contact</a></li>
    				</ul>
                <div class="footenote"> <span>&copy; Copyright &copy; 2011.</span> <span><a href="index.html">Smart&Co</a> all rights reserved</span> </div>
              </div>
              <div id="content">
                <div class="content">
    			<div class="icones">
    			<p>';	
    echo '<h2>Veuillez saisir un champ pour votre recherche<h2>';
     
     
      echo'
    			</div>
    			</div>
    			</div>
    			</div>
    			</div>
    			</div> 
    			</div>
    			</div>';	
     
    			header("Refresh: 1; URL=gestion.php");
    			}	
    else
    {
    	if (mysql_num_rows($query) > 0) 
    		{
    		echo '<div id="background">
    			<div id="page">
    			<div class="header">
    			<div class="footer">
    			<div class="body"><div id="sidebar"> <a href="index.html"><img id="logo" src="images/logo.gif" with="154" height="74" alt="" title=""/></a>
    				<ul class="navigation">
    					<li><a  href="index.html">Accueil</a></li>
    					<li class="active"><a href="gestion.php" >Gestion du Parc</a></li>
    					<li><a href="about.php">A propos</a></li>
    					<li class="last"><a href="contact.php">Contact</a></li>
    				</ul>
                <div class="footenote"> <span>&copy; Copyright &copy; 2011.</span> <span><a href="index.html">Smart&Co</a> all rights reserved</span> </div>
              </div>
              <div id="content">
                <div class="content">
    			<div class="tableau">
    			<p>';	
     
     
    			echo'<center><table border="1" width="75%"></center>';
    			echo '<tr><th>Nom du poste</th><th>Login</th><th>Ram</th><th>DD</th><th>CPU</th><th>Détails</th></tr>';
    			echo'</br>';
     
     
    			// BOUCLE SUR LES ECRANS
    			while ($lgreq != FALSE)
    				{	
    			$NomPoste = $lgreq['NomPoste'];
    			$login = $lgreq['Login'];
    			$ram = $lgreq['RAM'];
    			$cpu = $lgreq['CPU'];
    			$DD = $lgreq['DD'];
     
    			echo '
    			<tr>
    			<td align="center">'.$NomPoste.'</td>
    			<td align="center">'.$login.'</td>
    			<td align="center">'.$ram.'</td>
    			<td align="center">'.$DD.'</td>
    			<td align="center">'.$cpu.'</td>
    			<td align ="center"><a href="detailordi.php?NomPoste='.$NomPoste.'"><img src="images/oeil.png" border="0" alt="user" /></a></a></td>
    			</tr>';
     
    $lgreq=mysql_fetch_array($query);
    				}
    							echo '</table>';
    			echo'
    			</div>
    			</div>
    			</div>
    			</div>
    			</div>
    			</div> 
    			</div>
    			</div>';
     
    				} 
    else
    {
    			echo'
    	<div id="background">
    			<div id="page">
    			<div class="header">
    			<div class="footer">
    			<div class="body"><div id="sidebar"> <a href="index.html"><img id="logo" src="images/logo.gif" with="154" height="74" alt="" title=""/></a>
    				<ul class="navigation">
    					<li><a  href="index.html">Accueil</a></li>
    					<li class="active"><a href="gestion.php" >Gestion du Parc</a></li>
    					<li><a href="about.php">A propos</a></li>
    					<li class="last"><a href="contact.php">Contact</a></li>
    				</ul>
                <div class="footenote"> <span>&copy; Copyright &copy; 2011.</span> <span><a href="index.html">Smart&Co</a> all rights reserved</span> </div>
              </div>
              <div id="content">
                <div class="content">
    			<div class="icones">
    			<p>';	
    echo '<h2>Aucun résultat pour votre recherche<h2>';
     
     
      echo'
    			</div>
    			</div>
    			</div>
    			</div>
    			</div>
    			</div> 
    			</div>
    			</div>';	
     
    			header("Refresh: 1; URL=gestion.php");
    			}	
     
     
      echo'
    			</div>
    			</div>
    			</div>
    			</div>
    			</div>
    			</div> 
    			</div>
    			</div>';
    }
    Sur mon site, quand j'effectue une recherche par rapport au login.. au lieu de m'afficher un seul résultat, pour l'ordinateur correspondant au compte utilisateur, il m'affiche les 6 ordinateurs présents dans ma base de donnée.. je n'arrive pas a comprend pourquoi il me prend tout ces champs...

    Nom du poste Login Ram DD CPU Détails
    CFG0204201102 j.ayo 4 500 i5
    CFG0204201103 j.ayo 4 500 i5
    CFG0204201104 j.ayo 4 500 i5
    CFG0204201105 j.ayo 4 500 i5
    CFG0204201101 j.ayo 4 500 i5
    CFG0204201106 j.ayo 4 500 i5


    Merci pour votre aide

    Cordialement

  2. #2
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Essaie d'afficher ta requête juste avant qu'elle ne soit exécutée, pour voir ce que ça donne. Copie là dans ton phpmyadmin (ou autre truc du genre) pour voir le résultat. Ton problème est à mon avis un soucis de SQL, c'est ta requête qui est pas correcte.

    Remarque 1 : des "and" et des "or" qui s'enchainent sans parenthèses, c'est assez troublant, on ne sait jamais trop comment les priorités s'appliquent. Peut être que le problème vient de là ....

    Remarque 2 : Sérieusement, tu devrais faire un petit effort pour te protéger des injections SQL... N'importe qui pourrait détruire ta base de données avec ce code (si l'utilisateur qui exécute la requête a effectivement les droits pour, mais je parie que c'est root !).

  3. #3
    Membre habitué
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Par défaut
    coucou,

    merci pour ton aide.

    Alors j'avais effectivement essayé d'executé cette requête dans phpmyadmin

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * 
    FROM ordinateur, utilisateur
    WHERE ordinateur.IdUser = utilisateur.IdUser
    AND login LIKE  'j.ayo'
    le résultat est nickel :

    CFG0204201103 i5 500 4 BOS107B2 3 1 1 2020 3 Jean Ayo j.ayo j.ayo user

    une ligne pour l'user pas de souci..

    J'ai en effet constaté que dès que je mettais des "or $champ like '%recherche%'" le résultat n'était pas bon et pleins de ligne s'affichaient alors que le login n'est pas associé à cet ordinateur j'ai fait plusieurs tests je n'arrive pas à comprendre pourquoi...

    Pour la syntaxe il est vrai que je ne sais pas comment l'arranger, je vais essayer de mettre des parenthèses.. je suis débutante et manipule très peu le code php..

    Pour la sécurité aucun souci, ce site n'est pas en ligne c'est pour un projet d'école.. et la sécurité n'est pas une priorité. Merci du conseil cependant ça pourra me servir dans le futur

    Cordialement

    EDIT : dans mon code quand je met :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... where ordinateur.IdUser=utilisateur.IdUser and Prenom like '%$recherche%' or Login like '%$recherche%''
    la recherche du Prenom fonctionne direct, une ligne sans souci.. par contre si je fais une recherche sur le Login j'ai bien le souci.. Plusieurs lignes de résultats alors qu'il en faudrait qu'une seule.. Si j'inverse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ... where ordinateur.IdUser=utilisateur.IdUser and Login like '%$recherche%' or Prenom like '%$recherche%''
    C'est la recherche du login qui fonctionne et la recherche du prenom qui m'affiche pleins de ligne.. le problème viendrait donc effectivement du 'or'.. je ne vois pas comment je peux faire;. j'ai essayer avec des parenthèses mais la syntaxe n'est pas bonne..

  4. #4
    Expert éminent
    Avatar de CinePhil
    Homme Profil pro
    Ingénieur d'études en informatique
    Inscrit en
    Août 2006
    Messages
    16 818
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur d'études en informatique
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2006
    Messages : 16 818
    Billets dans le blog
    14
    Par défaut
    1) Les jointures s'écrivent depuis 20 ans avec l'opérateur JOIN. Il serait temps de s'y mettre !

    Si c'est ton prof qui t'a appris les jointures d'il y a 20 ans, tu lui diras de ma part qu'il faut qu'il se recycle !

    2) Évite de relancer la guerre des étoiles !

    3) Aère ton code, il sera plus facile à lire et à débuguer.

    4) L'utilisation d'alias rend la requête plus facile à lire et à débuguer. Il est fortement recommandé de les utiliser systématiquement dès qu'une requête emploie plus d'une table.

    5) Tu n'as jamais étudié les opérateurs logiques ? Jamais fait de table de vérité ?

    x AND y OR z != x AND z OR y car il y a un ordre hiérarchique dans l'exécution des opérations, tout comme en algèbre la multiplication a priorité sur l'addition.

    Cependant, dans le cas, présent, en écrivant correctement la jointure, on n'a pas besoin de parenthèses dans le WHERE car il n'y a plus que des OR.

    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
    // Protection contre les injections SQL
    $recherche = mysql_real_escape_string($_POST['recherche']);
     
    /* Requête avec les mots du langage SQL en capitales
     *  et correctement indentée  pour plus de clarté
    */
    $req = "
    	SELECT -- les colonnes nécessaires et pas étoile !
    	FROM ordinateur o
    	INNER JOIN utilisateur u ON o.IdUser = u.IdUser
    	WHERE o.RAM LIKE '%$recherche%'
    		OR o.CPU LIKE '%$recherche%'
    		OR o.DD LIKE '%$recherche%'
    		OR o.Login LIKE '%$recherche%' 
    		OR o.NomPoste LIKE '%$recherche%'
    ";
    Philippe Leménager. Ingénieur d'étude à l'École Nationale Supérieure de Formation de l'Enseignement Agricole, en retraite... mais toujours Autoentrepreneur à l'occasion.
    Mon ancien blog sur la conception des BDD, le langage SQL, le PHP... et mon nouveau blog sur les mêmes sujets.
    « Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément ». (Nicolas Boileau)
    À la maison comme au bureau, j'utilise la suite Linux Mageïa !

  5. #5
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Décembre 2006
    Messages
    242
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Décembre 2006
    Messages : 242
    Par défaut
    Je pense que le post précédent devrait résoudre tous tes soucis .
    J'ajouterai juste une chose :
    Citation Envoyé par nanou42 Voir le message
    Pour la sécurité aucun souci, ce site n'est pas en ligne c'est pour un projet d'école.. et la sécurité n'est pas une priorité. Merci du conseil cependant ça pourra me servir dans le futur
    En fait, il ne s'agit pas que de sécurité. Si tu ne protèges pas ta chaîne avant d'exécuter ta requete, et qu'un utilisateur tape une simple quote... Je te laisse voir le résultat...

  6. #6
    Membre habitué
    Inscrit en
    Janvier 2011
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Janvier 2011
    Messages : 10
    Par défaut
    Bonjour à tous,

    Merci à tous pour vos réponses, j'ai en effet pu résoudre mon problème !

    Je suis désolée pour la syntaxe, l'année passé j'ai vu les bases, et en effet, mon prof n'utilisait pas inner join.. j'aurais dut plus me documenter car je connaissais de nom..

    merci pour ta précision Climoo, j'avais déjà en effet mis une cote par inadvertance dans ma recherche et cela avait généré une erreur ! je comprend mieux à quoi sert mysql_real_escape_string !

    Merci encore !

    Cordialement

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

Discussions similaires

  1. Formulaire de recherche multitables
    Par SpyesX dans le forum Access
    Réponses: 7
    Dernier message: 24/11/2005, 11h50
  2. [MySQL] Formulaire de recherche PHP + un script d recherche en HTML
    Par Dsphinx dans le forum PHP & Base de données
    Réponses: 6
    Dernier message: 09/11/2005, 19h44
  3. alléger un formulaire de recherche
    Par jarod71 dans le forum Langage
    Réponses: 4
    Dernier message: 28/10/2005, 11h11
  4. Réponses: 3
    Dernier message: 20/10/2005, 12h42
  5. Réponses: 5
    Dernier message: 18/10/2005, 14h09

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