CONTRÔLE DU NOMBRE DE CARACTÈRES DANS UN CHAMPS TEXTAREA

pagis78 Messages postés 6 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 18 avril 2008 - 16 juil. 2006 à 17:56
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011 - 2 avril 2010 à 16:39
Cette discussion concerne un article du site. Pour la consulter dans son contexte d'origine, cliquez sur le lien ci-dessous.

https://codes-sources.commentcamarche.net/source/38494-controle-du-nombre-de-caracteres-dans-un-champs-textarea

masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
2 avril 2010 à 16:39
Cool,
Je suis content que tu ai finalement pu régler ton problème... et aussi de savoir que mon script fonctionne bien en fait... ;)

Une petite (grande) note?

A+ et bon code
Mabikas Messages postés 8 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 2 avril 2010
2 avril 2010 à 10:18
Ok je reconnais mon erreur :D

J'ai fais un petit bout de script histoire de l'illustrer au cas où y'aurai des gens que ça intéresse :)
<?php
header("Content-Type:text/html;");
header("Content-Type:charset=ISO-8859-1;");
$sValue = "Jé souis fatigué";
echo utf8_decode($sValue) . '
'; //Affiche : Jé souis fatigué
echo mb_detect_encoding($sValue) . '
'; // Affiche: UTF-8
echo mb_strlen($sValue, mb_detect_encoding($sValue)) . '
'; //Affiche bien 16

/**
* CREATE TABLE `ec_test` (
* `champ` varchar(16) CHARACTER SET latin1 COLLATE latin1_bin NOT NULL
* ) ENGINE=MyISAM DEFAULT CHARSET=latin1
*/

$rConnexion = mysql_connect('server', 'user', 'pass');
if(mysql_select_db('test', $rConnexion) !== false){
mysql_query("SET NAMES 'utf8'"); //Nécessaire car les !!!données!!! envoyées au serveur sont en UTF-8
mysql_query("INSERT INTO ec_test (champ) VALUES ('" . $sValue . "')");//Le charset de la table n'est pas important
//parce que notre ami Mysql se débrouille bien en fait et du coup on a bien toute la chaine 'Jé souis fatigué'
//stocké dans le champ, l'essentiel est d'indiqué que les informations envoyées sont UTF-8
}
else{
echo 'pb de connexion';
}
?>
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
1 avril 2010 à 21:44
Salut,
Je pense que tu prends le problème à l'envers, sans vouloir être têtu...
Voila comment je vois les choses:
Coté javascript, on comptabilise bien le nombre de caractères. puis quand on appuis sur le bouton de validation du formulaire, les données sont transmises à un srcipt PHP qui les interprètes.
Lors de la réception, on compte le nombre de bytes et non plus le nombre de caractères (dixit:"puisque je ne compte plus les caractères mais bien les bytes").
Ce qui ammène comme conclusion que le problème ne vient pas de mon script... mais plutôt de ce qui est fait des données reçues.

Si ton script PHP te dis que la taille de ta chaine est 18 alors que en vrais elle est de 16, c'est que PHP se trompe ou que tu n'utilise pas la fonction de comptage correctement.

////////////////////////////////////////////////////////
Doc PHP:
int mb_strlen ( string $str [, string $encoding] )
mb_strlen() retourne le nombre de caractères dans la chaîne $str, avec l'encodage $encoding.
Un caractère multi-octets est alors compté pour 1.

!!!!!! => $encoding est l'encodage de $str. Si $encoding est omis, l'encodage **interne** sera utilisé.

La fonction mb_strlen a besoin de savoir en quel charset se trouve la chaine que tu veux analyser

/////////////////////////////////////////////////////////////

string mb_detect_encoding ( string $str [, mixed $encoding_list [, bool $strict]] )

mb_detect_encoding() détecte l'encodage utilisé par la chaîne str. mb_detect_encoding() retourne le nom de l'encodage détecté

///////////////////////////////////////////////////////////////

Donc en combinant les deux on obtient ceci:

$nb_cars = mb_strlen($textarea_value,mb_detect_encoding($textarea_value));

Et là, php doit t'afficher 16 caractères et non 18...
Mabikas Messages postés 8 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 2 avril 2010
1 avril 2010 à 18:40
Hello,

Je me suis mal exprimé.
Imagine je suis dans un formulaire avec encodage UTF-8. Je vais dans mon textarea et je saisi : "Jé souis fatigué"
Là ton script va compter : 16
Je valide mon formulaire en appuyant sur bouton prévu à cet effet et passe à la vérification coté serveur:
PHP lui va compter (avec mb_strlen()) : 18

=> Le texte fais bien 16 caractères, mais 18 octets en somme

Du coup l'utilisateur se prends un message d'erreur parce que son texte est trop long pour être inséré en BDD alors que le JS lui disait que c'était bon.
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
1 avril 2010 à 18:23
et puis avec ça aussi...
header("Content-Type:text/html;");
header("Content-Type:charset=ISO-8859-1;");
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
1 avril 2010 à 18:22
???
Je ne saisi pas bien. Tu veux dire que je coupe en deux des caractères multibytes? Si je comprends bien ce que tu as écris, coté java le compte est bon... Donc c'est plustôt en PHP que ça plante?

Pour ce qui est de compter ou pas les bytes, il faut que tu regardes sur le site coté php. Il existe des script tout fait qui ausculte une chaine bytes à bytes et qui font ressortir les caractères. En multibytes, si certains bits sont positionnés, celà signifie que l'on est sur 2, ou trois bytes...

J'ai eu ce genre de problème lorsque j'ai traité upar ajax un textarea rempli par des architechtes (site applicatif). Ce que la pluspart faisait, c'est un copié/collé de Word. Du coup, ça me mettait le bronx dans la base de données car certains caractères n'étaient pas interprétés correctement.

J'ai résolut le problème en utilisant la fonction suivante:
$value = mb_convert_encoding($value,"cp1252",mb_detect_encoding($value));

Comme ça, je forcais la convertion du charset vers un plus traditionnel, et tout ce passait pour le mieux dans le meilleur des mondes.

Bon courage pour la suite
Mabikas Messages postés 8 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 2 avril 2010
1 avril 2010 à 17:52
Hello,

Je n'utilise pas ton script mais dans une recherche pour mon boulot, je suis amené à regarder un peu tout ce qui fait.
A ta question, c'est le JS qui se plante, parce que si le PHP est bien codé, il va compter le nombre de caractères en utilisant mb_strlen() qui est prévu pour gérer les chaînes de caractères encodés sur des systèmes multi-bytes.
Du coup ton script va dire => Mon textarea fais 500 caractères (et il aura pas complètement tord puisque visuellement ça fais bien 500 caractères)
PHP va dire => Moi j'en compte 513 (tout dépend des caractères qui ont été saisis dans le champs)
Donc je suis en train de m'orienter vers une solution où je vais compter les bytes coté JS et faire confiance à mb_strlen() coté serveur.
Le problème est que ce que tu fais pour restreindre l'affichage dans ton textarea : "textarea.value=textarea.value.substring(0,max);" ne marche pas puisque je ne compte plus les caractères mais bien les bytes, du coup le param max pour récupérer la chaine saisie par l'utilisateur ne correspond pas.

Donc la solution que je suis en train de faire sera peut être un plus ch*** à faire :D
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
1 avril 2010 à 17:29
Bonjour,
Je n'ai pas testé ton bug mais en lisant tes lignes, je devine que effectivement il doit y avoir un problème dans ce cas de figure puisque quand tu utilise UTF-8 (perso j'utilise iso-8859-1), les caractères sont codés sur plusieurs octets... donc évidemment, le compte n'est pas bon mon cher Maitre Capélo...

Question:
Qui se trompe? JS ou PHP? parceque si c'est PHP, alors le problème peut ne pas venir de mon script...

En tout cas, merci de m'avoir fait remonter l'info
Mabikas Messages postés 8 Date d'inscription mardi 4 novembre 2008 Statut Membre Dernière intervention 2 avril 2010
1 avril 2010 à 16:52
Hello,

Juste pour info, ton script ne gère pas le cas où ton textarea est affiché dans une page dont l'encodage est UTF-8, du coup ton comptage de caractère n'est pas bon.
Si tu fais une validation coté Client(JS) et un autre coté serveur(PHP) tu verra qu'il ne vont pas te donner la même valeur.
djoudjouly Messages postés 6 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 25 janvier 2009
25 janv. 2009 à 16:58
Et voilà!!!! ;-)

Je suis graphiste designer, je débute dans le développement pour me mettre à la page, et c'est chaud. Mais je vais m'accrocher...

Si tu as besoin n'hésite pas...
A plus!
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
25 janv. 2009 à 14:22
Merci, je dois avoir fini un site de vente en ligne avant la fin de la semaine prochaine... c'est chaud...

Bon taf à toi aussi...

PS: une petite note? ;)
djoudjouly Messages postés 6 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 25 janvier 2009
25 janv. 2009 à 09:04
Merci beaucoup pour ces infos précieuses. Je vais me jeter dans l'arène et espère mener mon combat à bien... ;-) Tu en seras le premier informé... Encore merci à toi!

Bon taf...
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
25 janv. 2009 à 00:33
Je te remercie de l'intérêt que tu porte à mon code.
Pour l'instant, je vais le laisser comme ça car je cours un peut après le temps au niveau taf.
J'y reviendrais plus tard pour intégrer ta demande.

Si tu veux y aller de ta propre patte, voici quelques indice qui pourront d'aider:
mettre en place un checkbox avec un évènement sur le 'onchange'


et dans la function il faut récuperer la valeur de l'attribut 'id_textarea' pour savoir de quel textarea on parle ainsi la valeur du checkbox (this.___) et en fonction de sa valeur positionner l'attribut 'control_length' du textarea soit à 1 soit à 0

Bon courage
djoudjouly Messages postés 6 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 25 janvier 2009
24 janv. 2009 à 19:24
Ou d'avoir un deuxième champ comme tu avais la première fois...
;-)

Merkiii
djoudjouly Messages postés 6 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 25 janvier 2009
24 janv. 2009 à 19:18
Merci beaucoup cela fonctionne très bien maintenant.
Je ne voudrais pas t'ennuyer, mais comment puis-je faire pour que avec une case à cocher par exemple, je peux passer en mode "caractère illimité". C'est une option que j'aimerai avoir... Si c'est trop complexe ne te prends pas la tête c'est déjà super comme ça!
Encore merci à toi...
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
24 janv. 2009 à 19:03
Merci à toi pour ce commentaire qui m'a rappelé (encore une fois) que j'avais mis ce script ici.

J'en ai donc profité pour tout remettre à jour et aussi pour intégrer la comptaibilité avec FF.

Voici donc un script légé et portable, facilement intégrable à vos applis

A pluche
djoudjouly Messages postés 6 Date d'inscription dimanche 1 juin 2008 Statut Membre Dernière intervention 25 janvier 2009
24 janv. 2009 à 13:25
Bonjour,
Je trouve que l'idée de ton formulaire est très sympa et très pratique. Mais après vérification dans Firefox et IE, il ne fonctionne pas du tout. Aucun décompte de caractères et aucune limite non plus... Aurais-tu fais une mise à jour du codage ?? Pourrais-tu nous la poster. Merci d'avance...
Neustradamus Messages postés 1 Date d'inscription samedi 8 février 2003 Statut Membre Dernière intervention 16 février 2007
16 févr. 2007 à 10:42
J'ai même problème, blocage à 200 ou 800 : normal, mais suppression après impossible.
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
15 déc. 2006 à 12:31
Salut, excusez moi de ne pas avoir répondu plus tôt. Je suis plus sur php et j'avais oublié que j'avais posté un source ici.

>>lorsque que l'on arrive à 200 caractères ... Plus moyen d'en supprimer un !!! Comment faire ???

Je n'ai pas ce problème là. Quand j'arrive au nombre de caractères maxi, la frappe est annulée, mais l'effacement reste possible. C'est bizare. As tu testé mon script?
dda45 Messages postés 2 Date d'inscription vendredi 8 avril 2005 Statut Membre Dernière intervention 20 novembre 2006
20 nov. 2006 à 17:43
J'ai fais un script sensblement pareil (sauf que j'utilise la méthode blur()) mais il reste un problème que ce script a aussi, lorsque que l'on arrive à 200 caractères ... Plus moyen d'en supprimer un !!! Comment faire ???
masternico Messages postés 487 Date d'inscription dimanche 5 octobre 2003 Statut Membre Dernière intervention 1 septembre 2011
17 août 2006 à 23:32
Il me semblait au contraire que cela permettait une intégration dans n'importe quel code. Me serais-je trompé?
C'est possible.
pagis78 Messages postés 6 Date d'inscription mercredi 20 juillet 2005 Statut Membre Dernière intervention 18 avril 2008 6
16 juil. 2006 à 17:56
Code bcp trop spécifique à ton portail.
Rejoignez-nous