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 :

Recherche sur cinq caractères dans champ Bdd


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut Recherche sur cinq caractères dans champ Bdd
    Bonjour,

    J'ai un petit moteur de recherche avec trois champs : id (clé primaire), numero_lot (text) et url (varchar). La recherche doit se faire sur le champ numero_lot qui a ce profil : N1141-13095.

    Les utilisateurs vont en fait rentrer une référence de ce type pour trouver leur fiche : N11410, les 5 premiers caractères du numero_lot.

    Je ne sais pas comment gérer cette recherche sur ces caractères, si on rentre N1141, ça marche très bien mais si le 0 est rajouté, il ne trouve plus rien.
    Pouvez-vous m'aider s'il vous plait ?

    Merci d'avance, je galère

    Code php : 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
     
    <?php
     
    $output='';
    mysql_connect('localhost','root','');
    mysql_select_db('xxxxxx');
     
    if(isset($_GET['recherche']) && !empty($_GET['recherche']) && strlen($_GET['recherche'])>2)
    {
     
    		$rec = trim(htmlentities($_GET['recherche']));
    }
    else
    {
            $rec = 'search';
     
    }
            $type = 1;//type par defaut: expression exacte
     
    $req = 'SELECT id,url, numero_lot FROM certificats WHERE ';
    if($type==1)
    {//ayant un des mots dans la recherche
            $mots = explode(' ',$rec);//En sépare l expression en mots cles
            foreach($mots as $mot)
            {
                  $req .= ' numero_lot LIKE "%'.$mot.'%" OR';
    	    }
     
    		$req .= ' 1=0';
    		echo 'Essayez autre chose';	
    }
    //classement numeros de lots
    $req .= ' order by id asc';
    $requete = mysql_query($req);
    ?>
     
     
     
    <table width="300px" border="0" cellspacing="2" cellpadding="2">
      <tr>
        <td width="76%"><form action="" method="get" >
    <fieldset style="background-color: #FFFFFF; border: 1px double #73aad2;">
                    <legend style="color: #294C74;font-size: 16px;font-family: Arial, Helvetica, sans-serif;padding-left:0px;padding-bottom:0px;padding-top:0px;"><strong>Certificate of analysis search </strong></legend>
     
     
                    <table width="94%" border="0" cellspacing="2" cellpadding="2">
                      <tr>
                        <td width="250"><input type="text" size="50px" name="recherche"   
     
    onfocus="if(this.value=='search'){ this.value = ''; this.style.color = '#000000'; }" onBlur="if (this.value == '') {this.value = 'search'; this.style.color = '#999999'; }"
    value="<?php echo $rec; ?>" /></td>
                        <td width="68">
     
    					<input type="submit" value="Search" />
    					<?php $type==1 ; ?>					</td>
                      </tr>
      </table>
    </fieldset>
    </form></td>
      </tr>
      <tr>
        <td>&nbsp;</td>
      </tr>
    </table>
     
     
     
    <table width="510" border=0px align="left">
     
    <tr class="Style2">
    <td width="393" height="15" align="left" style="font-family:Arial; font-size:12px; color:#155a97;border:2;border-bottom:1px solid #AFD3F3;background-color:#F2F9FD;" valign=top><strong>Lot Number </strong> </td>
     
    <td width="107" height="15" align="left" style="font-family:Arial; font-size:12px; color:#155a97;border:0;border:2;border-bottom:1px solid #AFD3F3;background-color:#F2F9FD;" valign=top><strong>Web links </strong></td>
    </tr>
     
     
     
     
    <?php
    //On affiche les resultats
    while($dnn = mysql_fetch_array($requete))
    {
    ?>
            </tr>
     
     
     
    	<tr>
    <td height="20" align="left" valign=top style="font-family:Arial; font-size:13px; color:#155a97;padding: 5px;border:0;border:2;border-bottom:1px solid #AFD3F3;background-color:#EBF4FC;">
    <?php echo strtoupper($dnn['numero_lot']); ?></td>
     
    <td align="center" style="font-family:Arial; font-size:12px; color:#155a97;border:0;border:2;border-bottom:1px solid #AFD3F3;background-color:#ffffff;" valign=top>
    <?php echo '<a href=
    "'.$dnn['url'].'" target="_parent">' . "<img src='xxxxxxx'" . 'align="left" target="_parent" border=0' . " alt='". htmlspecialchars($dnn['url'])."'></a>";?>					</td>
    </tr>          
     
     
    <?php
    }
    ?>
    </table>

  2. #2
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Bonjour,

    Je ne comprends pas, pour moi c'est normal que tu ne trouve rien.
    Ton profil est le suivant : N1141-13095
    Or la recherche (avec le 0) fait un chiffre de plus que ton profil :
    N1141-13095
    N11410 (il devrait y avoir un - à la place du 0 du coup la requête ne renvoie rien)

    Les solutions que je vois :
    1. Limiter le nombre de caractère pour la recherche (ne pas dépasser le - )
    2. Couper ta chaîne après la limite (juste avant le - ), rajouter le - et continuer ensuite. Pour cela tu peux utiliser la fonction substr()

  3. #3
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour et merci beaucoup pour ta réponse, c'est très gentil de me consacrer du temps
    En fait, est-ce que je dois le rajouter après la séparation des mots clès, mais ça ne prend plus la recherche.
    Le problème est que les utilisateurs vont taper leur référence en 6 digits et pas le numero_lot avec le tiret.
    Est-ce qu'il serait plus simple que je prévois un champ référence avec la ref en 6 caratères ?
    Merci

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $mots = explode(' ',$rec);
    $mots = substr($rec,0, -1);

  4. #4
    Membre confirmé Avatar de humitake
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    399
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 399
    Points : 578
    Points
    578
    Par défaut
    Bonsoir,

    Je pense que je viens de saisir ton problème :
    Tu dispose de ta table avec des références du styles : N1141-13095, N1141-13094, N1141-12095, ...
    Et tu souhaite pourvoir récupérer les 3 que je viens de citer en utilisant une recherche comme N11410 ou N11411 ?

    Dans ce cas le soucis majeur viens de ta construction de la requête sql
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $req .= ' numero_lot LIKE "%'.$mot.'%" OR';
    //Ce qui donnerai avec N11410 
    $res .= ' numero_lot LIKE "%N11410%" OR';
    //Ce qu'il faudrait pour que ça marche
    $res .= ' numero_lot LIKE "%N1141%0%" OR';

    Maintenant le problème est de savoir comment tu souhaite que la recherche soit effectué, si tu souhaite faire une recherche uniquement sur la deuxième partie de ton digit (après le tiret donc) dans ce cas je te propose cette solution :
    Code php : 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
     
    $req = 'SELECT id,url, numero_lot FROM certificats WHERE ';
    if($type==1)
    {//ayant un des mots dans la recherche
            $mots = explode(' ',$rec);//En sépare l expression en mots cles
            foreach($mots as $mot)
            {
                  $mot = substr($mot, 0, 5) . "%" . substr($mot, 5) . "%";
    //On récupère la partir avant le tiret puis on rajoute un % et on met ensuite la partie après le tiret et enfin un autre %
                  $req .= ' numero_lot LIKE "'.$mot.'" OR';
    	    }
     
    		$req .= ' 1=0';
    		echo 'Essayez autre chose';	
    }
    //classement numeros de lots
    $req .= ' order by id asc';
    $requete = mysql_query($req);
    Par contre quelques petite remarque :

    Utilise mysqli plutôt que mysql car cette dernière va venir à être supprimé :
    Citation Envoyé par php.net
    Cette extension est obsolète depuis PHP 5.5.0 et n'est pas recommandée pour écrire vos nouvelles lignes de code, sachant qu'elle sera supprimée dans un futur proche.
    Tu ferais bien d’échapper les caractères de la chaînes que tu passe dans ta recherche pour te protéger de l'injection SQL grâce à la méthode mysqli_real_escape_string() voir même mieux en utilisant les requêtes préparées.

    En espérant avoir résolu ton problème,
    Bonne nuit

  5. #5
    Membre actif
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : Vatican

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Mai 2004
    Messages : 144
    Points : 238
    Points
    238
    Par défaut
    Bonjour,

    tu devrais plutôt raisonner ainsi :

    les cinq premiers caractères du numéro saisie par l'utilisateur doivent être égale au cinq premiers caractères du numéro du lot.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    $mot = substr($mot, 0, 5);
    $req .= ' LEFT(numero_lot,5) ="'.$mot.'" OR';

  6. #6
    Membre à l'essai
    Femme Profil pro
    Inscrit en
    Février 2013
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Février 2013
    Messages : 21
    Points : 16
    Points
    16
    Par défaut
    Bonjour et merci beaucoup pour vos réponses, je vais tester ce que vous me proposez.
    Merci encore, ça m'aide beaucoup

Discussions similaires

  1. Rechercher le caractère % dans une BDD SQL 2k5
    Par Blacknounou dans le forum Administration
    Réponses: 3
    Dernier message: 06/04/2011, 05h55
  2. empecher saisie de caractères dans champ de type input text
    Par mussara dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 27/06/2006, 14h09
  3. Recherche sur 2 elements dans une liste box.
    Par molarisapa dans le forum Access
    Réponses: 2
    Dernier message: 29/05/2006, 18h43
  4. Caractères dans champ
    Par Sebmox dans le forum SQL Procédural
    Réponses: 2
    Dernier message: 11/05/2006, 11h47
  5. Recherche d'un caractère dans une une string...
    Par damien99 dans le forum C++
    Réponses: 3
    Dernier message: 02/01/2006, 10h22

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