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 :

Apostrophe dans une recherche


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 22
    Par défaut Apostrophe dans une recherche
    Bonjours, a tous.

    Plusieurs questions ici.

    Voila je travail actuellement sur les fonctions de recherche d'un site juridique, et j'ai remarqué que quand je cherchais "Manquement d'État" ça ne me renvoie rien ! Alors que si je cherche "Sociétés commerciales" où "Contrat d'assurance" ça marche sans soucis.

    J'ai donc remarqué que quand une recherche cumulait accent ET apostrophe ça ne fonctionnait pas.

    Une fois le constat fait, j'ai compris le soucis, je vais voir dans la base et la je vois sur des milliers de documents dont les mots clé sont "Manquement d’État" ... Bon a ce moment la je vais voir le code du module d'insertion et là sans surprise, le précédent stagiaire avait fait des htmlentities() dans les INSERT

    Du coup quand je cherchait un mot avec accent, vu que pour la recherche, je passe par htmlentities() ça marchait, idem pour les recherches sans accents. Mais quand on combine l'apostrophe et les accents ça ne trouve pas logiquement.


    Donc première question, j'ai immédiatement remplacé tous les htmlentites des modules par des mysql_real_escape_string() dans les INSERT. Problème quand j'ajoute "Manquement d'état" dans ma base ça m'affiche "Manquement d\'état" et impossible de faire une recherche convenable sur "Manquement d'état".

    Je vois dans le manuel php

    "Si magic_quotes_gpc est activée, appliquez d'abord la fonction stripslashes() à vos données. Utiliser cette fonction sur des données qui ont déjà été protégées, les protégera une deuxième fois"

    J'ai donc remplacé mes mysql_real_escape_string($texte) par des mysql_real_escape_string(stripslashes($texte)) dans mes INSERT et là, ça ajoute convenablement "Manquement d'état" dans ma base et je peux faire toutes les recherches que je veux en mélangeant majuscule minuscule apostrophe sans soucis. Mais est ce que la requête est bien sécurisé en associant escape et stripslashes comme j'ai du le faire ??

    Sinon mon autre soucis, j'ai des dizaines de millier de "eacute;" "Eacute;" etc dans ma base. Y a t'il un moyen rapide de les remplacer ? sans avoir besoin de créer une fonction qui recupere les documents ou il y a des &eacute, remet les accents et fait un update. Car bon je suis en stage et je veux pas me rater avec une grosse boucle qui update toute une base qui contient des dizaines de millier de document ^^ mais je crois que j'aurai pas le choix...

    Ou alors plutôt que tout remplacé dans la base, y a t il un moyen de construire une requete php qui trouve "Manquement d’État" dans ma base ? ^^


    Merci d'avance de votre aide. Et désolé pour le pavé, j'essaie d'être le plus clair possible

    PS : la base est en utf8_unicode_ci

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 329
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 329
    Billets dans le blog
    17
    Par défaut
    J'ai donc remplacé mes mysql_real_escape_string($texte) par des mysql_real_escape_string(stripslashes($texte)) dans mes INSERT
    Et le jour où les magic-quotes seront désactivées tu auras un stripslashes( ) de trop. Désactive les magic-quotes ou nettoie tes $_GET/$_POST/... selon get_magic_quotes_gpc( ).

    j'ai des dizaines de millier de "eacute;" "Eacute;" etc dans ma base. Y a t'il un moyen rapide de les remplacer ?
    Regarde du côté de html_entity_decode( ). Attention au charset, voir la doc de la fonction.
    Fais une sauvegarde et des tests avant d'appliquer la fonction à ta bdd.

    Ou alors plutôt que tout remplacé dans la base, y a t il un moyen de construire une requete php qui trouve "Manquement d’État" dans ma base ? ^^
    Mauvaise solution.

  3. #3
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Bonjour,

    Tu indiques que ta base est en utf-8, je suppose donc que tes scripts sont en utf-8 également.
    Si c'est le cas ; au même titre que pleins de fonctions autours des strings la fonctionnalité "magic quotes" est incompatible avec utf-8, elle peut casser les chaines de caractères utf-8.

    Après, utiliser des fonctions d'échappement relatives à l'affichage HTML comme équivalent à l'échappement en base de données est une très grossière erreur.

    Tu n'a pas trop le choix, va falloir t'assurer que les données en base n'ont pas été cassées par les magic quotes et tu devras de toutes manière tout nettoyer en virant les entités présentes dans toutes les colonnes de toutes les tables (passe par les procédures stockées).

    N'oublie pas de remercier aussi très, mais alors très chaleureusement le précédent stagiaire

  4. #4
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 22
    Par défaut
    Merci de vos réponses

    Pour le magic quote, j'avoue n'avoir jamais utilisé cette fonctionnalité. Ça ce désactive ou ? ^^

    Sinon :

    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 = mysql_query(
    "SELECT id,mot_cles // id est l identifiant de mon document, mot_cles la liste des mots cles
    FROM matable
    WHERE mot_cles LIKE "%'.htmlentities("é").'%"   OR  "%'.htmlentities("è").'%" etc... pour tous les caractères avec accent.
     
    while ($res = mysql_fetch_array($requete, MYSQL_ASSOC))
    {
        $tab[$res['id']]=html_entity_decode($res['mot_cles'])
    }
     
    foreach($tab as $id => $value)
    {
    mysql_query("
       UPDATE matable
       SET mot_cles = ".mysql_real_escape_string($value)."
       WHERE id = $id")
    }
    Vous pensez qu'un truc comme ça fonctionnerait ? Pour tout remplacer ?

    Bien sur je vais faire une sauvegarde préalable de la base :p

    Euh je sais pas trop si mes scripts sont en UTF8, mon notepad++ est en ANSII c'est tout ce que je peux te dire ^^

  5. #5
    Expert confirmé
    Avatar de rawsrc
    Homme Profil pro
    Dev indep
    Inscrit en
    Mars 2004
    Messages
    6 142
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Dev indep

    Informations forums :
    Inscription : Mars 2004
    Messages : 6 142
    Billets dans le blog
    12
    Par défaut
    Salut,

    tu trouveras ça dans le php.ini
    Tu peux aussi tester si cette fonctionnalité est activée avec get_magic_quotes_gpc().

    Ton script PHP est pas mal, mais par contre, sur une grosse base de données avec des dizaines de milliers d'enregistrements, je pense que c'est cuit.
    Sans compter que toutes les colonnes de toutes les tables ont dû être traitées de la même manière et pas seulement la colonne "mot-cles".
    Tu vas bloquer le serveur pour un sacré moment avec le risque du timeout.

    Dans l'ordre,
    - tu prépares tout sur le serveur de dev
    - tu copies la base en production sur le serveur de dev
    - tu désactives les "magic_quotes" si nécessaire (pense à redémarrer le serveur)
    - tu corriges le code PHP en charge de l'enregistrement des données en base (tu vires si tu trouves addslashes()) et remplaces par mysql_real_escape_string(),
    - tu fais l'inventaire de toutes les colonnes à balayer de toutes les tables
    - tu portes le code de remplacement des entités HTML en procédure stockée
    - tu écris la procédure stockée générale qui va balayer toute la base et appeler la fonction de nettoyage
    - tu testes tout
    - tu arrêtes le serveur de prod pour maintenance
    - tu sauvegardes la dernière version de la base en production
    - tu importes cette sauvegarde sur ton serveur de dev
    - tu exécutes la procédure stockée de nettoyage
    - si pas d'erreurs :
    - tu modifies en conséquence le php.ini du serveur de prod
    - tu publies le code PHP corrigé
    - tu exportes les données corrigées du serveur de dev vers le serveur de prod
    - tu redémarres tous les services
    - fin de la maintenance

    Purée, sacré stage dis-donc.
    A vrai dire c'est pas le travail d'un stagiaire, m'enfin...

  6. #6
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2013
    Messages
    22
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Avril 2013
    Messages : 22
    Par défaut
    Merci de la réponse ! Je vais regardé ca dans la journée pour le magic_quote.

    Pour ce qui est de la base. J'ai pas voulu prendre trop de risque.

    J'ai exporté les tables corrompu dans un .sql ( j etais en dessous de 16 mo donc c'est bon )

    J'ai ouvert le fichier avec notepad++, et j'ai remplacé tous les é et autre caractère spéciaux par les bons caractères avec la fonction remplacer tout. J'ai pensé comme toi que mon script PHP aller trop envoyer de requete donc je me suis abstenu.

    Après j'ai truncate les tables en question, et importé mon .sql modifier.

    J ai eu une peu peur au moment du truncate quand même mais apparemment ça a bien fonctionné donc bon ^^

    Ouep bah je suis stagiaire mais y a pas d autre informaticien dans la boite en fait ^^

  7. #7
    Invité
    Invité(e)
    Par défaut
    On est en 2013 faudrait peut-être utiliser PDO parce que là c'est une passoire...

Discussions similaires

  1. problème avec l'apostrophe dans une requête
    Par mika0102 dans le forum VBA Access
    Réponses: 7
    Dernier message: 09/03/2019, 16h51
  2. Réponses: 8
    Dernier message: 12/05/2006, 14h04
  3. [MySQL] Degré de pertinence dans une recherche sql
    Par Invité(e) dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 16/11/2005, 09h59
  4. Données contenant un apostrophe dans une colonne
    Par david71 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 13/09/2005, 17h02
  5. Problème de casse dans une recherche
    Par lipao17 dans le forum Langage SQL
    Réponses: 4
    Dernier message: 06/07/2005, 10h55

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