Categories > TinyButStrong general (FR) >

htmlspecialchars</a>]: Invalid multibyte sequence in argument

The forum is closed. Please use Stack Overflow for submitting new questions. Use tags: tinybutstrong , opentbs
By: aglachant
Date: 2011-03-23
Time: 14:25

htmlspecialchars</a>]: Invalid multibyte sequence in argument

Bonjour,

voilà après plusieurs heures de recherche je poste une demande d'aide car je n'arrive pas à résoudre ce problème...

j'ai un script qui charge une liste de messages (d'un forum) et qui plante avec le message suivant :
Erreur N° 2 du 2011-03-23 14:07:37 (CET)
Script : /home/beststra/public_html/common/tbs.class.php
Ligne : 2165
Type : Avertissement PHP
Message : htmlspecialchars() [<a href='function.htmlspecialchars'>function.htmlspecialchars</a>]: Invalid multibyte sequence in argument

Le resultat de ma requete qui est la suivante :
$query = 'SELECT usr.login, ans.login AS login_ans, mes.for_id, mes.mes_id, mes.usr_id, mes.picto_mess, mes.title, mes.nbansw, mes.nbrec, mes.credate, mes.upddate FROM pt_user AS usr JOIN pt_message AS mes ON mes.usr_id=usr.usr_id LEFT JOIN pt_user AS ans ON mes.usr_id_answ=ans.usr_id WHERE mes.usr_id=:usr_id AND mes.censored=0 ORDER BY credate desc LIMIT 150';
est stocké dans $mes_queue (par un FetchAll de PDO)
puis mergé : $tbs->MergeBlock('tpl_mes_queue',$mes_queue);

la partie html :
<tr class="[tpl_mes_queue.trClass]"  onmouseover="this.className='forumTrHover'" onmouseout="this.className='[tpl_mes_queue.trClass]'" onclick="window.open('/forum/message.php?forum=[tpl_mes_queue.for_id]&mes_id=[tpl_mes_queue.mes_id;block=tr]','_self')">
          <td class="forumTd" >
              <div style="float:left;margin:0 4px 0 4px;"><img src="[tpl_mes_queue.picto_mess;magnet=div]" /></div><span>[tpl_mes_queue.title;ope=max:25]</span>
        </td>
        <td class="forumTd"  align="center">
            <span>[tpl_mes_queue.nbansw]</span>
        </td>
        <td class="forumTd"  align="center">
            <span>[tpl_mes_queue.nbrec]</span>
        </td>
        <td class="forumTd" >
            <span>[tpl_mes_queue.login]</span>
        </td>
        <td class="forumTd" >
            <span>[tpl_mes_queue.login_ans]</span>
        </td>
        <td class="forumTd" >
            <span>[tpl_mes_queue.upddate;frm=dd/mm/yyyy hh:nn]</span>
        </td>
      </tr>

...j'ai diminué la "LIMIT" au fure et à mesure pour voir si le probleme persistait et trouver l'enregistrement qui pouvait en etre la cause...à 22 pas de problème, à 25 patrack...
j'ai donc regardé les 3 enregistrements "delta" potentiellement à l'origine du plantage mais rien d'anormal...

avez-vous une idée d'où peut venir le problème ?

merci de votre aide !
Cordialement,
Alexanrdre
By: Skrol29
Date: 2011-03-24
Time: 01:09

Re: htmlspecialchars</a>]: Invalid multibyte sequence in argument

Salut,

Ces le paramètre "ope=max:25" qui crée une mauvaise coupure dans la chaîne texte de ton champ [title] parce qu'elle est probablement en UTF-8.
Essaye le paramètre "maxutf8" en complément pour éviter ce problème.

Plus d'info :
http://www.tinybutstrong.com/fr/manual.php#html_field_prm_ope
By: aglachant
Date: 2011-03-24
Time: 15:36

Re: htmlspecialchars</a>]: Invalid multibyte sequence in argument

Bonjour skrol,

et merci de ton aide, ...bon j'ai essayé de rajouter maxutf8 mais ça ne marche toujours pas...je suis effectivement en encodage UTF8...et le problème vient certainement de l'option ope car

quand je retire l'option ope=max:25 le probleme disparait, ...j'ai d'ailleurs essayer de trouver le caractère qui me provoque ça mais je ne vois rien de rien...as-tu une autre idée ?
By: aglachant
Date: 2011-08-01
Time: 10:16

Re: htmlspecialchars</a>]: Invalid multibyte sequence in argument

Bonjour skrol,

bon là c'est pire que tout ...toutes mes pages web m'affichent cette erreur maintenant !

impossible de trouver d'où cela vient, ma base mysql est encodée en utf8_general_ci (InnoDB) et mon ouverture de connection sql spécifie systématiquement le charset utf8.

y a t il un moyen de corriger ou contourner ce probleme à ta connaissance ?

tu peux constater le probleme ici : http://www.bests-traders.com

HELP please je suis déséspéré !

merci d'avance
By: Skrol29
Date: 2011-08-01
Time: 21:48

Re: htmlspecialchars</a>]: Invalid multibyte sequence in argument

Bonjour,

Ben je ne vois rien.
By: aglachant
Date: 2011-08-02
Time: 08:46

Re: htmlspecialchars</a>]: Invalid multibyte sequence in argument

Bonjour skrol,
oui j'ai dû 'fixer' le probleme car je ne pouvais pas laisser le site HS.
voilà la modif que j'ai fais pour palier le probleme car je ne trouvais pas d'autre solution mais c'est vraiment pas propre du tout :
1) Ajout de cette fonction :
function my_validate_utf8($text) {
  if (strlen($text) == 0) {
    return TRUE;
  }
  // With the PCRE_UTF8 modifier 'u', preg_match() fails silently on strings
  // containing invalid UTF-8 byte sequences. It does not reject character
  // codes above U+10FFFF (represented by 4 or more octets), though.
  return (preg_match('/^./us', $text) == 1);
}

2) Modification de la ligne ($Txt = htmlspecialchars($Txt, ENT_QUOTES, $this->HtmlCharSet);) dans tbs.class.php par :
if ($this->HtmlCharSet=="utf-8" && my_validate_utf8($Txt))
            $Txt = htmlspecialchars($Txt, ENT_QUOTES, $this->HtmlCharSet);
      else
            $Txt =  htmlspecialchars($Txt, ENT_QUOTES);

Est-ce qu'il y a un moyen dans ton script de détecter quelle partie des données (ou du template) pose le probleme ?
j'ai bien essayé d'afficher le contenu de $Txt avant le htmlspecialchars, mais je n'ai rien vu qui posait probleme...enfin si le message d'erreur lui meme mais ca ne m'aide pas...
By: Skrol29
Date: 2011-08-03
Time: 20:27

Re: htmlspecialchars</a>]: Invalid multibyte sequence in argument

Bonjour Aglachant,

Tu m'a dit que tu base MySQL est en UTF-8. Il faut vérifier toute la chaîne :
- la table est-elle en UTF-8 ?
- ta connexion de PHP à MySQL est-elle configurée pour retourner de l'UTF-8 ?  (tu peux t'en assurer en exécutant l'instruction SQL "SET NAMES 'utf8';" juste après la connexion)
- ton modèle HTML est-t-il un fichier UTF-8 et a-t-il l'entête HTML <meta http-equiv="Content-type" content="text/html; charset=UTF-8"/> ?
- ton code source PHP est-il un fichier UTF-8 ? (bug classique : si c'est de l'ANSI, des caractères zarbi apparaissent lors de l'affichage de texte)

Après-ça, si ça ne résout rien, je dois pouvoir reproduire le résultat et l'examiner pour pouvoir t'aider.
Est ce que tu pourrais commencer par m'envoyer par email un échantillon de données qui pose problème.
J'aurais besoin d'une part de quelques lignes qui figurent dans la base de données. Un simple dump de la table réduit à quelques lignes, dont tu sais qu'au moins une pose problème, me suffirait.
D'autre part il me faudrait aussi un échantillon de données vues par PHP. Ce n'est pas très dure, voici comment faire :
Tu repères le MergeBlock qui produit l'erreur, ce doit être quelque chose comme ça :
$TBS->MergeBlock('bloc', $cnx, $sql);
et tu le remplaces par :
$resultat = $TBS->MergeBlock('bloc,*', $cnx, $sql);
var_export($resultat); exit;
Ça te génères le code PHP correspondant aux données vues coté PHP.