UPDATE ... SET

Résolu
Bonjour à tous !

J'ai besoin d'aide svp.

J'ai deux feuilles pour editer un champ dans la base de données, mais j'ai un problème et sollicite votre aide.

index.php a ceci :
<form action="add_notes.php" method="get">
<textarea name="BlocNotes" id="input" style="width:100%; height:200px;"><?php echo utf8_encode(stripslashes($data['BlocNotes'])); ?></textarea>
<input name="envoyer" type="submit" class="btn blue" id="button" value="Enregistrer la note" />
</form>

La seconde feuilles qui est add_notes.php a ceci :
<?php
if(isset($_POST['BlocNotes'])) $BlocNotes=$_POST['BlocNotes']; else $BlocNotes=""; 
if(empty($BlocNotes)){echo '<div class="Erreur">Il n\'y a aucune note dans le Bloc notes.</div>';}
else {$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS)  or die('Erreur de connexion '.mysql_error()); mysql_select_db(MYSQL_BASE,$db)  or die('Erreur de selection '.mysql_error());
$sql = "UPDATE Alifat_Blocnotes SET BlocNotes='$BlocNotes' WHERE NumId='1'";
mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
echo '<div class="Message">Bloc notes enregistré avec succès.</div>';
mysql_close();} ?>


Si je garde else $BlocNotes=""; j'ai le message d'erreur qui s'affiche. Et si je le retire, j'ai une édition bizarre.
Le texte initial est : les élèves vont êtres surpris, et s'il y avait du danger...
Si j'edite donc j'aurai ceci : les Ãf©lÃf¨ves vont Ãfªtres surpris, et s'il y avait du danger...

Or j'avais juste demandé à supprimer ", et s'il y avait du danger..."

L'édition ne s'exécute pas entièrement.

Pouvez-vous m'aider svp ?
Merci d'avance.

34 réponses

Résumé de la discussion

Problème d'encodage et de sauvegarde d'un champ BlocNotes entre une page de saisie et le script de mise à jour MySQL. La chaîne est affichée avec utf8_encode et le formulaire utilise la méthode GET, ce qui peut entraîner des caractères corrompus et une édition partielle. Des solutions proposées incluent retirer utf8_encode et ajouter onsubmit='editor.post()' afin que les mises à jour du WYSIWYG se répercutent correctement dans la textarea lors de l'enregistrement. En pratique, l'utilisation de POST plutôt que GET et une gestion cohérente du charset peuvent aussi éviter les textes affichés en pseudo-encodage lors des réouvertures.

Bobot (l’IA à votre service)
  1. Contributeur
    Et en virant le <script>....</script> du form et en le mettant en fin de page ?!
    1. J'ai installé le script chez moi pour voir.
      Il ne semble pas poser de problème d'encodage, il ne faut pas mettre la fonction utf8_encode, c'est tout.
      Par contre, il ne prend en compte les modifications qu'en mode source. Et ceci qu'on soit en utf8 ou pas, qu'il y ait des caractères spéciaux ou pas.

      Je n'ai pas trouvé de manuel de cet éditeur, tu as un lien sur le site de l'éditeur (du logiciel)?
      1. Contributeur
        Ce qui est bizarre c'est que j'utilise aussi cet éditeur.
        Mon initialisation n'est pas la même, mais en tout cas ça marche à merveille !
      2. Comment as-tu fait pour l'utiliser ? Il y avait un vrai manuel, ou simplement un exemple ?
      3. Contributeur
        Normalement l'exemple à cette page fonctionne bien.
    2. Je viens de trouver la solution pour le problème de non-prise en compte dans l'édition. Il faut lire ce qui est écrit sur le site de l'éditeur
      Keep in mind that before posting you will need to call the instance.post() function to ensure that the latest changes in the WYSIWYG translate into the text area.
      Autrement dit, il suffit d'ajouter onsubmit="editor.post()" dans la balise <form> et chez moi ça marche très bien.
      1. Tu pouvais aussi faire la même chose avec le onclick du bouton de validation
    3. Salut,
      Essayes de mettre ceci :
      <?php
      if(isset($_POST['BlocNotes'])) $BlocNotes=$_POST['BlocNotes']; else $BlocNotes=""; 
      if(empty($BlocNotes)){echo '<div class="Erreur">Il n\'y a aucune note dans le Bloc notes.</div>';}
      else {$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS)  or die('Erreur de connexion '.mysql_error()); mysql_select_db(MYSQL_BASE,$db)  or die('Erreur de selection '.mysql_error());
      $sql = "UPDATE Alifat_Blocnotes SET BlocNotes='stripslashes($BlocNotes)' WHERE NumId='1'";
      mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
      echo '<div class="Message">Bloc notes enregistré avec succès.</div>';
      mysql_close();} ?>
      

      J'ai juste rajouté un stripslashes à ta variable $BlocNotes étant donné que tu es susceptible d'avoir des simples quotes
      1. Contributeur
        Hello,

        La syntaxe

        if (condition) action2 ; else action1;

        Est à proscrire autant que possible. Il faut privilégier la syntaxe :

        if (condition){
           action2;
        } else {
           action1;
        }
        1. Bonjour

          Je me demande comment, avec method="get", tu retrouves tes données dans $_POST.
          SInon, ce que tu observes est lié au fait que tu utilises la fonction utf8_encode. Nous n'avons qu'une partie de ton code, mais on peut supposer que ton encodage est incohérent quelque part entre entre ton éditeur, ta base de données et tes balises méta. Pour essayer de contourner le problème, tu utilises utf8_encode, ce qui marche sur des données initialement en iso8859-1. Quand tu reprends ces données, maintenant codées en utf8, et que tu appliques à nouveau la fonction utf8_encode, ça donne ce résultat.
          1. Contributeur
            Rha toujours là pour voir les incohérences du code toi ! ;-)
          2. Ça me semble la démarche la plus naturelle pour trouver les causes des erreurs, non ? Même si dans ce cas précis, l'incohérence get / post n'a pas de rapport avec son problème d'encodage, on tombe dessus quand on regarde.
          3. Contributeur
            D'un côté je ne suis pas sûr que l'encodage soit son problème principal. Il me semble qu'il désirait supprimer une partie de sa phrase...
          4. Bien sûr que si, c'est le problème..
            Il a voulu éditer une partie de sa phrase, c'est une saisie dans le textarea. Peu importe que dans cet exemple, il ait voulu supprimer une partie de sa phrase ou l'allonger, le problème c'est que quand il ré-affiche l'ancien texte, il y a des caractères 'anormaux'. D'ailleurs, s'il l'édite à nouveau, il en aura encore plus...
          5. Exactement le père. Si j'affiche l'ancien, les caractères sont encore plus anormaux !
            Si je supprime le code <javascrip> il prends tout en compte, y compris l'édition de la phrase...
        2. Oui, avec le code donné ci-dessus de Meloo, j'obtiens ceci :
          stripslashes(On test le bloc note maintenant !
          ÃfÂfÃ'©lÃfÂfÃ'¨ve
          ÃfÂfÃ'ªtre
          ÃfÂfÃ'®lots
          vÃfÂfÃ'Â'tre)


          Même le stripslashes(...) est affiché :D
          1. Le seul moyen de t'en tirer, c'est d'être cohérent entre ton éditeur de texte, ta base de données et ta balise meta d'encodage. Le lien de Mihawk est un bon point de départ pour bosser le sujet, mais il ne faut pas espérer résoudre ton problème en ajoutant des utf8_encode au petit bonheur à la chance. Et si tu as l'impression d'avoir résolu ton problème comme ça (rappelle-toi une histoire de fond rouge et de fond vert), tu peux être sûr qu'il ressurgira.
            1. Contributeur
              En effet, l'un des problème majeur des webmasters est que leurs bases sont en UTF-8 mais que leurs DOCTYPE HTML sont spécifiés en ISO-8859... D'où quelques incohérences.

              Il faut donc généralement encoder en UTF-8 avant l'insertion et décoder les données de la base avant affichage sur la page.
            2. Il faut donc généralement encoder en UTF-8 avant l'insertion et décoder les données de la base avant affichage sur la page
              Il ne faut ni encoder, ni décoder, sauf si on importe des données depuis des fichiers extérieurs dont on ne maîtrise pas le codage.
              Quand on travaille en utf8, on fait tout en utf8. C'est comme si tu disais que pour travailler en français, il faut traduire en anglais pour insérer dans la base de données, et retraduire en français pour afficher. C'est faisable, mais absurde, tu perdras des informations lors de la traduction, et ça donnera du boulot supplémentaire au serveur.
              Je n'ai parcouru que rapidement le lien que tu as donné à Sinistrus, j'espère que ce n'est pas là-dedans que tu as trouvé ce conseil car c'est une très mauvaise idée.
          2. Ça ne résout pas mon problème :S
            L'édition ne se fait toujours pas.
            Ni avec l'encodage ni avec l'édition de la phrase...
            Je vais vous donner mes deux pages, les codes entiers si ça ne vous dérange pas.

            Page index.php :
            <?php
            $db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS);
            mysql_select_db(MYSQL_BASE,$db);
            $sql = 'SELECT * FROM Alifat_Blocnotes WHERE NumId=1';
            $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error());
            while($data = mysql_fetch_assoc($req)){
            ?>
            <form action="add_notes.php" method="get">
            
            <textarea name="BlocNotes" id="BlocNotes" style="width:100%; height:200px;"><?php echo utf8_encode(stripslashes($data['BlocNotes'])); ?></textarea>
            <script type="text/javascript">
            	new TINY.editor.edit('editor',{
            	id:'BlocNotes',
            	width:'100%',
            	height:280,
            	cssclass:'te',
            	controlclass:'tecontrol',
            	rowclass:'teheader',
            	dividerclass:'tedivider',
            	controls:['bold','italic','underline','strikethrough','|','subscript','superscript','|',
            			  'orderedlist','unorderedlist','|','outdent','indent','|','leftalign',
            			  'centeralign','rightalign','blockjustify','|','unformat','|','undo','redo','n',
            			  'image','hr','link','unlink','|','cut','copy','paste','print'],
            	footer:true,
            	fonts:['Calibri'],
            	xhtml:true,
            	cssfile:'style.css',
            	bodyid:'editor',
            	footerclass:'tefooter',
            	toggle:{text:'source',activetext:'wysiwyg',cssclass:'toggle'},
            	resize:{cssclass:'resize'}
            });
            </script>
            <input name="envoyer" type="submit" class="btn blue" id="button" value="Enregistrer la note" />
                </form>


            Page add_notes.php :
            <?php
            if(isset($_POST['BlocNotes'])) $BlocNotes=$_POST['BlocNotes']; else $BlocNotes=""; 
            if(empty($BlocNotes)){echo '<div class="Erreur">Il n\'y a aucune note dans le Bloc notes.</div><script type="text/javascript">window.setTimeout("location=(\'index.php\');",1000)</script>';}
            else {$db = mysql_connect(MYSQL_HOST, MYSQL_USER, MYSQL_PASS)  or die('Erreur de connexion '.mysql_error()); mysql_select_db(MYSQL_BASE,$db)  or die('Erreur de selection '.mysql_error());
            mysql_query("SET NAMES 'utf8'");
            $sql = "UPDATE Alifat_Blocnotes SET BlocNotes='$BlocNotes' WHERE NumId='1'";
            mysql_query($sql) or die('Erreur SQL !'.$sql.'<br>'.mysql_error());
            echo '<div class="Message">Bloc notes enregistré avec succès.</div><script type="text/javascript">window.setTimeout("location=(\'index.php\');",1000)</script>';
            mysql_close();} ?>


            Donc là, si je laisse dans tout les cas le
            else $BlocNotes=""; 
            j'aurai le message du
            <div class="Erreur"></div>
            et si je le retire, j'aurai une édition uniquement sur les caractères spéciaux.
            Maintenant et ce qui est bizarre, c'est que si je modifie mon texte en mode "source" depuis mon textarea, et clique pour éditer, l'édition se fait avec succès a l'exception des caractères spéciaux...

            En mode mise en forme, pas d'édition de phrases
            En mode mise en forme, transformation des caractères spéciaux
            En mode source, édition avec succès
            En mode source, transformation des caractères spéciaux
            1. J'ai changé ma table en utf8_bin

              Problème de caractères spéciaux dans :
              Mode mise en forme : Résolu
              Mode source : Résolu

              Maintenant :
              Si je reste en mode mise en forme et édite = Refus d'édition
              Si je reste en mode source et édite = Résolu
              Si je suis en mode mise en forme et modifie le texte puis affiche la source et reviens en mise en forme et édite = Résolu
              1. Contributeur
                So what ?
            2. Ta page index m'étonne
              pas de balise doctype, pas de balise html, pas de balise meta pour signaler que tu travailles en utf8 ? Tu ne travailleras jamais correctement en utf8 comme ça
              1. Non ne t'inquiète pas pour ce détail, c'est pour ne pas bourrer la page de code.
                Le problème de l'encodage fonctionne maintenant, tout est réglé a l'exception de l'édition en mode mise en forme et/source.

                En mode mise en forme :
                http://data.imagup.com/12/1153554776.jpg
                Il n'édite rien

                En mode source :
                http://data.imagup.com/11/1153554769.jpg
                Il édite avec succès

                Si je modifie en mode mise en forme et affiche la source et reviens en mise en forme, il édite.
                Si je reste en mise en forme et édite, il ne fait rien...
                1. Non ne t'inquiète pas pour ce détail,
                  Ce ne sont pas des détails. Mais je veux bien arrêter de m'inquiéter pour toi.
                  tout est réglé a l'exception de
                  Donc tout n'est pas réglé.
                  Comme je te l'ai déjà dit, tu règles des cas particuliers. Tant que tu ne t'attaqueras pas au vrai problème, ça continuera.
                  1. Oups... désolé !
                    Voici ma partie entête :
                    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
                    <html xmlns="http://www.w3.org/1999/xhtml">
                    <head>
                    <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
                    </head>
                    <body>


                    Ma base est en utf8_bin et le reste du code est au dessus de ce poste.

                    Y a t-il autre chose qui vous aiderais à m'aider :$ ?
                    1. Malheureusement, je n'ai pas la moindre idée si ton éditeur javascript traite correctement l'utf8 ou non. Je suis allé voir sur leur site (je ne lai pas tout fouillé non plus), je n'ai pas trouvé l'information.

                      Car sinon, en retirant ta fonction utf8_encode, et en revoyant la façon d'utiliser stripslashes, ça a l'air correct.
                      1. Effectivement, c'est ce que je pensais...
                        J'ai ajouter dans ce code :
                        <textarea name="BlocNotes" id="BlocNotes" style="width:100%; height:200px" onKeyUp="document.getElementById('BlocNotes2').value = this.value"><?php echo utf8_encode(stripslashes($data['BlocNotes'])); ?></textarea>
                        <script type="text/javascript">
                        new TINY.editor.edit('editor',{
                        	name:'BlocNotes',
                        	id:'BlocNotes',
                        	width:'100%',
                        	height:280,
                        	cssclass:'te',
                        	controlclass:'tecontrol',
                        	rowclass:'teheader',
                        	dividerclass:'tedivider',
                        	controls:['bold','italic','underline','strikethrough','|','subscript','superscript','|',
                        			  'orderedlist','unorderedlist','|','outdent','indent','|','leftalign',
                        			  'centeralign','rightalign','blockjustify','|','unformat','|','undo','redo','n',
                        			  'font','size','style','|','image','hr','link','unlink','|','cut','copy','paste','print'],
                        	footer:true,
                        	fonts:['Calibri','Courier New','Verdana','Arial','Georgia','Trebuchet MS'],
                        	xhtml:true,
                        	cssfile:'style.css',
                        	bodyid:'editor',
                        	footerclass:'tefooter',
                        	toggle:{text:'source',activetext:'wysiwyg',cssclass:'toggle'},
                        	resize:{cssclass:'resize'}
                        });
                        </script>
                        Pour avoir dans un autre Textarea le contenue de mon premier textarea.
                        En mode mise ne forme il n'affiche rien mais en mode source il copie le contenu du premier au second...

                        Donc le problème vient du javascript.
                        Je penses que si j'arrive à mettre le "name" en valeur, il prendra en compte l'enregistrement... qu'en pensez-vous ?
                        1. Non, ce qui compte, c'est qu'il y aitr id et name dans ta balise textarea, et c'ets bien le cas.
                          Pour vérifier si c'est le script qui nous embête, on va essayer de s'en passer
                          Retire le passage <script..</script> après le texarea
                          Retire la fonction utf8_encode avant le textarea
                          Et regarde si ça édite bien maintenant (avec des nouveaux messages, les anciens sont corrompus désormais)
                          1. Effectivement, c'est le <script..</script> qui pose problème.
                            Lorsque je le retire, il affiche un textarea "normal" et lors de l'édition il fait ce qu'il faut.
                            Si je remet, alors il se transforme (le textarea) en mode mise en forme (comme l'image ci-dessus) et nous pose ce problème...
                            • 1
                            • 2