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. 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. Contributeur
                            Installe Firebug, active la console pour voir les erreurs Javascript et relance ta page. Manifestement tu n'initialises pas TinyMCE comme il faut.

                            Mihawk
                            "The Weapon of Choice"
                            1. J'ai bien peur de ne pas pouvoir t'en dire plus. Il faudrait aller voir sur les forums consacrés à cet éditeur, il doit bien y en avoir. Bonne chance.

                              Au fait, tu as toujours method="get" et tu utilises $_POST pour recevoir tes données ? je ne comprends pas comment ça peut marcher. Il y a peut-être un truc là.
                              1. Contributeur
                                C'est surtout que son initialisation est assez complexe ; il faudrait enlever des options pour voir.
                            2. Oui je l'ai toujours... tu proposes une solution pour cela ?
                              1. Contributeur
                                Tu as testé avec Firebug...?
                            • 1
                            • 2