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 dans base de donnée avec apostrophe dans les champs [MySQL]


Sujet :

PHP & Base de données

  1. #1
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut Recherche dans base de donnée avec apostrophe dans les champs
    Bonjour, je veux faire une requette SQL avec WHERE dont la valeur de la variable peut contenir des informations avec apostrophe.

    Si j'échappe la valeur de cette variable du where de ma requette, celle-ci s’exécute bien mais comme j'ai : 'ma/'variable' celle-ci retourne une valeur vide puisque la recherche se fait sur la valeur "ma/'variable".
    Si j'échappe l'ensemble de la variable qui constitue ma requette, cela donne : /'ma/'variable/' et j'ai une erreur de syntaxe.
    Si j’enlève les apostrophes entourant ma variablem de la requette, cela donne : ma/'variable , j'ai bien sur une erreur de syntaxe également car je n'ai qu'une cote dans la requette.

    Je n'arrive pas à trouver la solution.

    Merci de m'aider.

  2. #2
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    Il vaut mieux utiliser les méthodes existantes pour gérer cela avec les requêtes préparés par exemple
    regardez les exemple de code là : http://php.net/pdo.prepare

  3. #3
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Bonjour Mathieu,

    Je ne suis pas un pro du php, et je regarde ta solution depuis que tu à posté et je ne vois pas comment l'utiliser dans mon cas ?

    Merci de m'orienter un peu.

  4. #4
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tu peux lire ce tuto : Comprendre PDO.
    Et sinon, poster ton code actuel peut éventuellement nous aider à t'aider.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  5. #5
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Bonjour Celira,

    Les explications de ton lien me semble bien compliqué pour moi qui n'ai que des rudiments de php.

    Poster mon code n'aidera pas beaucoup non plus car comme je le disait je recherche à partir d'une requette les informations dans une base correspondant, dans mon cas au pseudo de membre, qui dans certains cas on un ' dans le libéllé.
    Donc forcément dans le where de cette requette et la variable contenant ce pseudo, le contenu peut ressemble à cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * from ma_table where pseudo = 'pseu'do' order by pseudo asc
    Et là obligatoirement ça coince.
    Merci de m'aider.

  6. #6
    Membre émérite Avatar de vttman
    Homme Profil pro
    Développeur "couteau mosellan"
    Inscrit en
    Décembre 2002
    Messages
    1 140
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur "couteau mosellan"
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2002
    Messages : 1 140
    Points : 2 286
    Points
    2 286
    Par défaut
    Et bêtement ... En utilisant les " pour encadrer ces informations avec apostrophe ?
    Y a t'il aussi des " dans les informations ? Quand même plus rare ...
    Emérite, émérite je ne pense pas ... plutôt dans le développement depuis FORT FORT longtemps, c'est mon job, ça oui
    A part ça ... Il ne pleut jamais en Moselle !

  7. #7
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Sinon, tu peux essayer échapper l'apostrophe avec un \ : 'ma/\'variable/'.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  8. #8
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Bonjour vttman,

    Non il n'y a pas de " dans les champs, mais je ne peux pas construire ma requette comme ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    "SELECT * from ma_table WHERE pseudo = "$pseudo" ORDER BY pseudo ASC"
    Cette requette étant dèjà une zone entre " cela m'en fait 4 " dans la même requette.

    @Celira
    Si tu parle de mettre uniquement \ devant le ' cela ne marche pas car il prend ses 2 caractères comme faisant partie de la valeur à recherché, donc plus de correspondance.
    Mais dans l'exemple que tu me montre tu met également des / .
    2 questions à quoi cela sert 'il, et y a t'il une commande pour le faire.

    Merci à vous deux

  9. #9
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Tout dépend de comment tu fais l'interrogation à la base :
    Si tu utilises les fonctions mysql_xxxx, tu peux utiliser mysql_​real_​escape_​string.
    Si tu utilises mysqli ou PDO, le mieux est d'utiliser une requête préparée.

    Et si tu ne sais pas ce que tu utilises, il faut que tu nous montres le bout de ton code qui fait l'appel à la requête pour qu'on puisse te le dire.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  10. #10
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    J'utilise mysqli_query
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    if(isset($pseudo))$sql_rec = "SELECT * from ma_table WHERE pseudo = '$pseudo' ORDER BY pseudo ASC";
    $qry_req =  mysqli_query($connection, $sql_rec) or die ('Echec de la requete '.$sql_req.' : '.mysqli_error($connection)); 
    $ma_table = mysqli_fetch_array($qry_req);
    $num_req = mysqli_num_rows($qry_req);
    .
    .
    .

  11. #11
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    La version la plus simple est d'utiliser mysqli_real_​escape_​string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(isset($pseudo)) $sql_rec = "SELECT * from ma_table WHERE pseudo = '".mysqli_real_escape_string($connection, $pseudo)."' ORDER BY pseudo ASC";
    $qry_req =  mysqli_query($connection, $sql_rec) or die ('Echec de la requete '.$sql_req.' : '.mysqli_error($connection)); 
    $ma_table = mysqli_fetch_array($qry_req);
    $num_req = mysqli_num_rows($qry_req);
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  12. #12
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $findme   = "'";
    $pos_apo = strpos($pseudo, $findme);
    if($pos_apo >= 1)
    {
    $sql_rec = "SELECT * from ma_table WHERE pseudo = '".mysqli_real_escape_string($connection, $pseudo)."' ORDER BY pseudo ASC";
    }
    $qry_req =  mysqli_query($connection, $sql_rec) or die ('Echec de la requete '.$sql_rec.' : '.mysqli_error($connection)); 
    $ma_table = mysqli_fetch_array($qry_req);
    $num_req = mysqli_num_rows($qry_req);
    malheureusement je n'ai anormalement aucune correspondance car quand je fais un écho $sql_rec pour $pseudo j'ai 'pseu'do' donc la cote avant et arriere doivent êtres prisent en compte et le pseudo n'ai pas trouvé.

  13. #13
    Modératrice
    Avatar de Celira
    Femme Profil pro
    Développeuse PHP/Java
    Inscrit en
    Avril 2007
    Messages
    8 633
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Développeuse PHP/Java
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2007
    Messages : 8 633
    Points : 16 372
    Points
    16 372
    Par défaut
    Non, inutile de te prendre la tête avec tout ça. Normalement, juste appliquer mysqli_real_escape_string sur la chaine comme je l'ai fait dans mon exemple suffit à échapper l'apostrophe en trop.
    Modératrice PHP
    Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs. (Rappel : "ça ne marche pas" n'est pas un message d'erreur)
    Cherchez un peu avant poser votre question : Cours et Tutoriels PHP - FAQ PHP - PDO une soupe et au lit !.

    Affichez votre code en couleurs : [CODE=php][/CODE] (bouton # de l'éditeur) et [C=php][/C]

  14. #14
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Bonjour Celira,

    Tu as raison que je ne me prenne pas la tête pour ça, mais je m’interroge pourquoi je n'ai aucune correspondance avec un enregistrement de ma table alors que je devrais en avoir 1 ?
    C'est pourquoi j'ai pensé que soir ce sont, soit les apostrophes avant et après le pseudo, soit \ avant ' dans le pseudo qui font que ces caractères sont pris dans les critères de recherche et aboutissent à aucun résultat.

  15. #15
    Expert éminent sénior
    Avatar de mathieu
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    10 235
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 10 235
    Points : 15 532
    Points
    15 532
    Par défaut
    quand une requête ne retourne pas les résultats attendus, ça peut être utile de la tester dans phpMyAdmin pour l'étudier sous un autre angle.

  16. #16
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Bonjour Mathieu,

    Même résultat dans phpmyadmin il semble bien que les cotes avant et après, ainsi que \ de 'pseu\'do' fassent partis des caractères recherchés dans mon champ. Donc aucune correspondance.

  17. #17
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Je confirme que l'échappement est intégré à la chaîne à recherché et il n'y à donc aucune correspondance, mais la requête n'a plus son problème de triple cote.

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    as-tu testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $pseudo = "pseu'do";
    $sql_rec = "SELECT * from ma_table WHERE pseudo = '".mysqli_real_escape_string($connection, $pseudo)."' ORDER BY pseudo ASC";
    Si ça fonctionne, alors c'est ta méthode de récupération du pseudo depuis le formulaire qui est à revoir.

    Normalement (et puisque tu utilise mysqli_real_escape_string pour protéger la requête), il suffit de faire :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $pseudo = ( !empty($_POST['pseudo']) )? $_POST['pseudo'] : '';

  19. #19
    GYK
    GYK est déconnecté
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    406
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 406
    Points : 94
    Points
    94
    Par défaut
    Merci jreaux62, c'était une bonne piste.

    Merci également à tous ceux qui précédemment m'ont aidés pour arriver à cette solution.

    Bon Week-End à tous !

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 16/01/2013, 17h20
  2. Réponses: 4
    Dernier message: 04/09/2010, 15h32
  3. Réponses: 4
    Dernier message: 10/05/2009, 10h18
  4. [MySQL] Script php avec insertion dans base de données qui s'arrête tout seul
    Par tofito dans le forum PHP & Base de données
    Réponses: 9
    Dernier message: 04/12/2008, 21h39
  5. [MySQL] Insertion de données avec apostrophes dans ma base
    Par kawther dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/04/2007, 09h06

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