Partage
  • Partager sur Facebook
  • Partager sur Twitter

Problème d'enregistrement des apostrophes dans bdd

Sujet résolu
    1 septembre 2024 à 18:53:58

    Bonjour,

    Cela fait tout le dimanche que je cherche sans parvenir à trouver de solution car pas assez compétent je pense, je me tourne donc vers qqun de compétent en dernier recours, est-ce qu'il y aurait une bonne âme pour m'aider SVP?

    Voici mon problème:

    Lorsque les données provenant d'un formulaire contiennent le symbole ['] (apostrophe), l'enregistrement dans ma base de données remplace le symbole ['] par ['].

    - En développant mon site en local le problème ne se présente pas et je peux tout à fait enregister des données contenant le symbole ['].

    - J'ai constaté que la norme d'interclassement avait été modifiée sur ma bdd on line, passé de utf-8 à utf8mb4.

    - J'ai constaté que la norme d'interclassement n'avait pas été modifiée dans ma bdd locale, restée en utf-8.

    - J'ai essayé de changer le charset de ma page qui envoi le formulaire en y mettant charset=utf8mb4 ou utf8mb3 également essayé, sans succès.

    - L'insertion dans ma bdd est faite à l'aide d'une requête préparée, la voici ci dessous:

                // ON ENREGISTRE UN NOUVEL UTILISATEUR STANDARD
                $reqNewUser = $bdd->prepare('INSERT INTO users (e_mail, mot_de_passe, date_inscription, confirmation_visiteur, etat, utilisateur_privilegie, groupe_link, groupe_display, nom, prenom, adresse, code_postal, localite, telephone, fonction, date_debut_decompte, the_annuel_en_secondes, the_mensuel_en_secondes) VALUES(:e_mail, :mot_de_passe, CURDATE(), :confirmation_visiteur, :etat, :utilisateur_privilegie, :groupe_link, :groupe_display, :nom, :prenom, :adresse, :code_postal, :localite, :telephone, :fonction, CURDATE(), :the_annuel_en_secondes, :the_mensuel_en_secondes)');
                $reqNewUser->execute(array(
                    'e_mail' => $e_mail_NewUser,
                    'mot_de_passe' => "$mot_de_passe_provisoire",
                    'confirmation_visiteur' => "",
                    'etat' => "Actif",
                    'utilisateur_privilegie' => "Standard",
                    'groupe_link' => $groupe_link_admin,
                    'groupe_display' => $groupe_display_admin,
                    'nom' => $nom_NewUser,
                    'prenom' => $prenom_NewUser,
                    'adresse' => $adresse_NewUser,
                    'code_postal' => $code_postal_NewUser,
                    'localite' => $localite_NewUser,
                    'telephone' => $telephone_NewUser,
                    'fonction' => $fonction_NewUser,
                    'the_annuel_en_secondes' => "0",
                    'the_mensuel_en_secondes' => "0",
                ));
    
                $reqNewUser->closeCursor();


    - Je ne rencontre pas de problème pour l'insertion des lettre accentuées ou des symboles spéciaux

    Je vous remercie par avance pour votre précieuse aide.

    A disposition pour toute précision.

    • Partager sur Facebook
    • Partager sur Twitter
      1 septembre 2024 à 22:31:22

      Ce n'est pas une question de jeu de caractères.

      J'imagine que tu fais LA chose à ne pas faire : appliquer un htmlspecialchars à tes données avant l'insertion ?

      Et pour expliquer la différence de comportement entre les 2 environnements c'est que tu ne dois tout simplement pas utiliser la même version de PHP (détail qui aurait été utile) puisque htmlspecialchars "n'échappait" pas l'apostrophe par défaut avant PHP 8.1.0 (le "mode" - valeur par défaut de son deuxième paramètre - est passé de ENT_COMPAT à ENT_QUOTES) (ie en dév : PHP < 8.1.0, en prod : PHP >= 8.1.0)

      > 8.1.0 flags à changé de ENT_COMPAT à ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401.

      > ENT_COMPAT Convertit les guillemets doubles, et ignore les guillemets simples.

      > ENT_QUOTES Convertit les guillemets doubles et les guillemets simples.

      Pour clarifier, la solution n'est pas de spécifier ENT_COMPAT en second paramètre de tes htmlspecialchars actuels mais d'employer correctement htmlspecialchars en le déplaçant sur tes echo et assimilés (il n'a rien à faire ailleurs).

      PS : possible de déplacer le sujet vers le forum PHP puisque MySQL est tout sauf coupable ?

      -
      Edité par julp 1 septembre 2024 à 22:40:09

      • Partager sur Facebook
      • Partager sur Twitter
        2 septembre 2024 à 12:46:53

        En soit ce n'est pas vraiment un souci, ça encode l'apostrophe dans sa représentation html; si tu utilises les données dans une page HTML, ça devrait décoder automatiquement en apostrophe.
        • Partager sur Facebook
        • Partager sur Twitter
          2 septembre 2024 à 14:37:25

          > ce n'est pas vraiment un souci

          On galère depuis des décennies à faire comprendre la différence entre XSS et injections SQL donc minimisons le problème de fond histoire de bien faire perdurer la confusion. Si personne ne lui dit que ce n'est pas correct comment veux-tu qu'il en ait conscience ? (lui et tous ceux qui pourraient lire ce sujet)

          Il n'y a pas mort d'homme, certes, mais ça n'en est pas correct (et le niveau de sécurité n'est pas forcément le même puisque ce qui n'aura pas déjà transité par sa bdd + htmlspecialchars est susceptible de présenter une XSS)

          > si tu utilises les données dans une page HTML

          Génial le boulot inutile (htmlspecialchars_decode) dès que tu veux générer autre chose que du HTML ...

          -
          Edité par julp 2 septembre 2024 à 16:39:43

          • Partager sur Facebook
          • Partager sur Twitter
            2 septembre 2024 à 18:41:37

            Bonjour julp,


            Je te remercie pour ton aide très précieuse et également pour ta compréhension, je ne suis effectivement pas développeur et certaines bases m'échappent malheureusement.


            J'ai essayé en vitesse pendant ma pause, voici le résultat:


            - En retirant les htmlspecialchars avant l'insertion en bdd ça fonctionne et les ['] s'enregistrent maintenant correctement.

            - En dev j'utilise un PHP 7 et en prod un PHP 8.


            En résumé tu as vu TOUT juste, MERCI BEAUCOUP ENCORE POUR TON AIDE.


            A partir de maintenant je ne placerai plus jamais de htmlspecialchars avant insertion en bdd mais uniquement lorsque j'affiche les données qui proviennent de ma bdd et ça grâce à toi ! Merci mille fois

            Je vais essayer de déplacer le sujet vers le forum PHP.

            Je te souhaite une très bonne soirée.

            ---

            Salut umfred,

            Je te remercie pour ton commentaire.

            Passe une bonne soirée.



            -
            Edité par adriano79 2 septembre 2024 à 18:43:51

            • Partager sur Facebook
            • Partager sur Twitter
              2 septembre 2024 à 19:00:04

              Bonjour,

              Déplacement vers un forum plus approprié

              Le sujet est déplacé de la section Base de données vers la section PHP

              Sujet résolu

              Tu peux passer le sujet à "résolu" (bouton en haut à droite du sujet) et cliquer sur les pouces levés des messages qui t'ont aidé⋅e ;)

              • Partager sur Facebook
              • Partager sur Twitter
                2 septembre 2024 à 21:38:32

                > A partir de maintenant je ne placerai plus jamais de htmlspecialchars avant insertion en bdd mais uniquement lorsque j'affiche les données qui proviennent de ma bdd et ça grâce à toi !

                Voilà au détail près que sauf exceptions clairement identifiées, il faut un htmlspecialchars sur ce que tu renvoies (affiches) dynamiquement au client (echo, <?=, print, etc), que ça sorte de ta base de données ou non (un fichier texte/XML, le résultat d'une API ou peu importe).

                • Partager sur Facebook
                • Partager sur Twitter

                Problème d'enregistrement des apostrophes dans bdd

                × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                • Editeur
                • Markdown