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 gérant les apostrophes des mots recherchés [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut Formulaire de recherche gérant les apostrophes des mots recherchés
    Bonjour,

    J'ai un formulaire de recherche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    <form id="monform2"  method="get" action="liste.php"> 
     
          <input type="text" class="inputRecherche" name="clesearch"  value="<?php if(isset($_GET['clesearch'])) echo $_GET['clesearch']; ?>" />
     
    	<input type="radio" class="bl_radio" name="search" value="scontrib"  checked="checked"  /> <label for="contributeur" class="bl_radio_label">contributeur</label>
    	<input type="radio" class="br_radio" name="search" value="stitre" <?php if (isset($_GET['search']) && $_GET['search'] == "stitre" ) {echo 'checked="checked"';} ?>  /> <label for="titre" class="br_radio_label">titre</label>
     
    <input type="image" src="styles/img/btn2_ok.png" class="bt_ok" id="" name="">
     
     </form>
    et le code suivant :

    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
    if ( $clesearch != null &&  $search == "scontrib") { // POUR GERER RECHERCHE PAR CONTRIBUTEUR
     
    $select_livre  = " SELECT L.TITRE AS titre, L.ID_LIVRE AS id_livre,
    YEAR(L.DATE_ACHAT)AS date_achat,YEAR(L.DATE_PUBLICATION)AS date_publication,YEAR(L.DATE_LECTURE)AS date_lecture, L.miniatures AS miniatures,
    ED.NOM_EDITEUR AS editeur,ED.ID_EDITEUR AS id_editeur,LIB.NOM_LIBRAIRIE AS librairie,LIB.ID_LIBRAIRIE AS id_librairie,FORM.NOM_FORMAT AS format,FORM.ID_FORMAT AS id_format,
    L.RESUME AS resume, L.STATUT_LECTURE AS statut_lecture, L.APPRECIATION AS appreciation,L.NB_PAGES AS nb_pages,
    CB.NOM_CONTRIBUTEUR, CB.PRENOM_CONTRIBUTEUR, F.NOM_FONCTION, CB.ID_CONTRIBUTEUR, F.ID_FONCTION
     
    FROM LIVRE L
     
    INNER JOIN PARTICIPE P ON P.ID_LIVRE = L.ID_LIVRE
    INNER JOIN CONTRIBUTEURS CB ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR      
    INNER JOIN FONCTION F ON F.ID_FONCTION = P.ID_FONCTION
     
    INNER JOIN EDITEUR ED		
    ON ED.ID_EDITEUR = L.ID_EDITEUR	
     
    INNER JOIN LIBRAIRIE LIB		
    ON LIB.ID_LIBRAIRIE = L.ID_LIBRAIRIE
     
    INNER JOIN FORMAT FORM		
    ON FORM.ID_FORMAT = L.ID_FORMAT
     
    WHERE NOM_CONTRIBUTEUR LIKE '%".$_GET['clesearch']."%' 
    ORDER BY date_achat DESC
     
    ";
    }
     
    if ( $clesearch != null  &&  $search == "stitre") { // POUR GERER RECHERCHE PAR TITRE
     
    $select_livre  = " SELECT L.TITRE AS titre, L.ID_LIVRE AS id_livre,
    YEAR(L.DATE_ACHAT)AS date_achat,YEAR(L.DATE_PUBLICATION)AS date_publication,YEAR(L.DATE_LECTURE)AS date_lecture, L.miniatures AS miniatures,
    ED.NOM_EDITEUR AS editeur,ED.ID_EDITEUR AS id_editeur,LIB.NOM_LIBRAIRIE AS librairie,LIB.ID_LIBRAIRIE AS id_librairie,FORM.NOM_FORMAT AS format,FORM.ID_FORMAT AS id_format,
    L.RESUME AS resume, L.STATUT_LECTURE AS statut_lecture, L.APPRECIATION AS appreciation,L.NB_PAGES AS nb_pages
     
     
    FROM LIVRE L
     
     
    INNER JOIN EDITEUR ED		
    ON ED.ID_EDITEUR = L.ID_EDITEUR	
     
    INNER JOIN LIBRAIRIE LIB		
    ON LIB.ID_LIBRAIRIE = L.ID_LIBRAIRIE
     
    INNER JOIN FORMAT FORM		
    ON FORM.ID_FORMAT = L.ID_FORMAT
     
    WHERE TITRE LIKE '%".$_GET['clesearch']."%' 
    ORDER BY date_achat DESC
     
    ";
    }
    Mon formulaire de recherche est opérationnel tant que le ou les mots recherchés ne contiennent pas d'apostrophe. En revanche, si par exemple je recherche un mot tel que l'île, j'ai une erreur de syntaxe sql. Je comprends que l'erreur se situe au niveau du WHERE de la requête en raison des apostrophes...Comment faire pour échapper les apostrophes des mots recherchés ? Je précise que je travaille sous MySql. Merci d'avance de votre aide.

  2. #2
    Membre confirmé
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Points : 453
    Points
    453
    Par défaut
    Salut,
    Pour echapper les apostrophes, il faut que tu utilises la fonction PHP mysql_real_escape_string sur les variables que tu utilises dans les requêtes SQL.
    Keep it simple, stupid !

  3. #3
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci pour ta réponse. Mais comme je suis débutant, j'ai du mal à utiliser la fonction. Dois-je insérer cette ligne de code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mysql_real_escape_string($clesearch)
    Si oui, à quel endroit de mon code ?
    Merci pour toute aide complémentaire.

  4. #4
    Modérateur
    Avatar de sabotage
    Homme Profil pro
    Inscrit en
    Juillet 2005
    Messages
    29 208
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Juillet 2005
    Messages : 29 208
    Points : 44 155
    Points
    44 155
    Par défaut
    Il y a un exemple d'utilisation dans la doc :
    http://php.net/manual/fr/function.my...ape-string.php
    N'oubliez pas de consulter les FAQ PHP et les cours et tutoriels PHP

  5. #5
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    En m'inspirant de la doc, j'ai fait le code suivant :

    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
    $requete_pagination   = "SELECT COUNT(*) AS nb_total FROM livre ";
     
    $clesearch = (iSset($_GET['clesearch']) ? $_GET['clesearch'] : null); // recherche par auteur et titre
    $search = (iSset($_GET['search']) ? $_GET['search'] : null); // recherche par auteur et titre
     
     
     
    if ( $clesearch != null &&  $search == "scontrib"){
     
    $requete_pagination .= sprintf(' INNER JOIN PARTICIPE P ON P.ID_LIVRE = livre.ID_LIVRE
    INNER JOIN CONTRIBUTEURS CB ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR      
    INNER JOIN FONCTION F ON F.ID_FONCTION = P.ID_FONCTION WHERE NOM_CONTRIBUTEUR LIKE "%'.$_GET['clesearch'].'%" ',
    mysql_real_escape_string($clesearch));
     
    }	
     
    $resultat_pagination = mysql_query($requete_pagination) or die('Erreur SQL !'.$requete_pagination.'<br>'.mysql_error());
    Mais j'ai le warning suivant :

    Warning: sprintf() [function.sprintf]: Too few arguments ...

    En voyez-vous la raison ? Merci.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    faut echape les % dans le sprintf %%
    par contre il sert a rien la pusique tu gardes ton $_GET...

  7. #7
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    En faisant comme cela (je ne peux pas tester pour l'instant) ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    if ( $clesearch != null &&  $search == "scontrib"){
     
    $requete_pagination .= sprintf(' INNER JOIN PARTICIPE P ON P.ID_LIVRE = livre.ID_LIVRE
    INNER JOIN CONTRIBUTEURS CB ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR      
    INNER JOIN FONCTION F ON F.ID_FONCTION = P.ID_FONCTION WHERE NOM_CONTRIBUTEUR LIKE "/%'.clesearch.'/%" ',
    mysql_real_escape_string($clesearch));
     
    }
    Merci par avance de vos avis.

  8. #8
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    non il faut echappé les % avec un %, et le principe d'un sprintf c'est qu'on ne met pas de variable dedans, de plus la t'as une constante, regarde la doc de sprintf

  9. #9
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Bonjour,

    J'ai regardé la doc. J'avoue que cela reste confus... Auriez-vous l'amabilité de m'aider encore peu pour construire ma requête en utilisant la fonction sprintf couplée à la fonction mysql_real_escape_string. Merci d'avance.

  10. #10
    Membre confirmé
    Avatar de Tesing
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2009
    Messages
    272
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Septembre 2009
    Messages : 272
    Points : 453
    Points
    453
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    if ( $clesearch != null &&  $search == "scontrib"){
     
    $requete_pagination .= sprintf(' INNER JOIN PARTICIPE P ON P.ID_LIVRE = livre.ID_LIVRE
    INNER JOIN CONTRIBUTEURS CB ON CB.ID_CONTRIBUTEUR = P.ID_CONTRIBUTEUR      
    INNER JOIN FONCTION F ON F.ID_FONCTION = P.ID_FONCTION WHERE NOM_CONTRIBUTEUR LIKE "%%%s%%" ',
    mysql_real_escape_string($clesearch));
     
    }
    Keep it simple, stupid !

  11. #11
    Membre habitué
    Homme Profil pro
    Inscrit en
    Janvier 2010
    Messages
    365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Janvier 2010
    Messages : 365
    Points : 192
    Points
    192
    Par défaut
    Merci beaucoup Ton code fonctionne et me permet de mieux comprendre la fonction sprintf. Merci aussi à stealth35.

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

Discussions similaires

  1. Enlever les diacritiques des mots arabes
    Par bayouta19 dans le forum Langage
    Réponses: 11
    Dernier message: 09/12/2013, 15h44
  2. [AC-2010] Vérifier les spécifications des mots de passe
    Par toumack dans le forum VBA Access
    Réponses: 4
    Dernier message: 21/12/2012, 09h08
  3. Recherche concernant les applications des smartphones
    Par cedrix57 dans le forum Algorithmes et structures de données
    Réponses: 0
    Dernier message: 23/10/2011, 09h25
  4. Mysql et la recherche full-text (liste des mots à ignorer)
    Par pogo_nkt dans le forum Installation
    Réponses: 4
    Dernier message: 27/01/2011, 00h39

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