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 :

Requête de recherche et apostrophe [MySQL]


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut Requête de recherche et apostrophe
    Bonjour à tous,

    Avant de poster, j'ai consciencieusement regardé les diverses docs traitant du sujet, et il n'en manque pas...

    Le champ varchar de ma table contient la chaîne :

    Poudre d\'Origan pour pizza
    La clause where de la requête - avec le mot clé "poudre d'origan" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    WHERE nom LIKE '%".mysql_real_escape_string($_GET['motcle'])."%'
    Comme de bien entendu, pas de résultat retourné.
    Avec addslashes ? Pareil !
    Avec sprintf, comme vu dans ce forum ? idem.

    Alors que "poudre" ou "origan" sont trouvés.

    Et le plus bizarre, c'est que le moteur de recherche de phpMyAdmin ne trouve pas mieux même si on utilise %LIKE%...

    Alors il faut y faire quoi, à cette apostrophe ?

  2. #2
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    Salut

    Poudre d\'Origan pour pizza
    Pourdre et Origan ont des majuscules, c'est peut être un problème de casse.


    Essai comme ceci pour voir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $motcle = mysql_real_escape_string($_GET['motcle']);
    $sq = "
    SELECT truc
    FROM matable
    WHERE LOWER(nom) LIKE %'".strtolower($motcle)."'%
    ";

  3. #3
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Bonjour et merci de me répondre,

    Non, pas mieux.
    Je crois que c'est vraiment l'apostrophe qui coince.
    Parce que "origan" et "Origan" sont trouvés, tout comme "poudre" et "Poudre".

  4. #4
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    J'avais pas fait gaffe à ceci :
    Le champ varchar de ma table contient la chaîne :
    Poudre d\'Origan pour pizza
    Normalement cette donnée dans ta Bdd ne devrait pas être échappée, elle doit être comme ceci : Poudre d'Origan pour pizza
    Ca veut dire que lors de l'insertion ou modification il y a eu des doubles échappement : Poudre d\\'Origan pour pizza

    Dans un 1er temps il faudrait supprimer cet échappement de trop, est fait un essai, ça devrait fonctionner.
    Après ça, il faudrait revoir ces étapes d'insertion ou/et modification de façon qu'il n'y ait plus ces caractères d'échappement.
    Dans ton PhpMyAdmin, tu ne devrait pas les voir.


    Il faudrait que tu vérifie la config du php.ini : magic_quotes_gpc si c'est On ou Off.
    Il est depuis très longtemps maintenant conseillé de mettre Off.
    Si c'est à Off, alors il doit avoir un addslashes par là lors des insertion/modifications.

  5. #5
    Membre éprouvé Avatar de renaud26
    Homme Profil pro
    Webmaster
    Inscrit en
    Mars 2003
    Messages
    1 365
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Webmaster

    Informations forums :
    Inscription : Mars 2003
    Messages : 1 365
    Par défaut
    Humm, oui tu as raison.
    Je viens de tester avec un insert d'apostrophe échappée avec mysql_real_escape_string et c'est inséré "d'origan", sans \ ni ''.

    ...et du coup la requête matche correct.

    J'imagine que cela s'est produit lors d'un export / import de la BDD via phpMyAdmin et un fichier texte.

    Alors...il va falloir que je crée une fonction pour extraire les noms, les nettoyer des antislashes, et les ré-injecter avec mysql_real_escape_string...
    Pas gagné, ça...

    magic_quotes_gpc est à ON.

    Edit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    $sql = mysql_query("SELECT id, nom FROM produits");
    while($row = mysql_fetch_assoc($sql)){
    	$nom = stripslashes($row['nom']);
    	mysql_query("UPDATE produits SET nom = '".mysql_real_escape_string($nom)."' WHERE id='".$row['id']."'");
    }
    devrait faire l'affaire.

  6. #6
    Membre Expert Avatar de RunCodePhp
    Profil pro
    Inscrit en
    Janvier 2010
    Messages
    2 962
    Détails du profil
    Informations personnelles :
    Localisation : Réunion

    Informations forums :
    Inscription : Janvier 2010
    Messages : 2 962
    Par défaut
    magic_quotes_gpc est à ON.

    Le fond de ton problème vient de là.

    Cette directive échappe automatique tous les ', et du coup, lorsque tu applique un mysql_real_escape_string() lors des insertion/modifs, et bien cette dernière considère que le caractère échappé précédemment fait partie de la chaine (au même titre que les autres caractères), c'est comme ça comme que tu vois ce anti-slash dans PhpMyAdmin.

    Il faudrait redéfinir à Off cette directive, et à l'ensemble de ton application.
    Soit le redéfinir dans le .htaccess, soit en Php avec un ini_set().

    Faut espérer que ton application n'est pas trop volumineuse, mais surtout qu'il y ait pas trop de choses liées à ça, sinon, les effets de bords te guettes.
    Mais c'est quand même la meilleurs chose à faire, car cette directive est vouée à disparaitre, ce qui reviendra au même quelle soir à Off.


    C'est le genre de truc qu'il faut définir dès le départ d'un projet, tout comme le jeu de caractère, etc ...

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

Discussions similaires

  1. Optimisation d'une requête de recherche
    Par Bobtop dans le forum Requêtes
    Réponses: 16
    Dernier message: 14/06/2006, 16h27
  2. Requête de recherche dans un forum
    Par Gwipi dans le forum Requêtes
    Réponses: 3
    Dernier message: 18/05/2006, 11h38
  3. requête sur recherche d'un mot
    Par Yaone dans le forum Langage SQL
    Réponses: 7
    Dernier message: 12/04/2006, 09h54
  4. [XPATH] [XML] [JAVASCRIPT] Pb de recherche avec apostrophe
    Par lenoil dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 21/02/2006, 14h28
  5. Requête sélection : recherche par nom
    Par leeloo77 dans le forum Access
    Réponses: 7
    Dernier message: 17/02/2006, 15h39

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