Formulaire PHP : problème de TRIM [Résolu] - PHP - Programmation
Marsh Posté le 03-12-2012 à 15:09:26
Je pense que tu ne devrais pas poster de script dont tu n'es pas l'auteur, à moins d'en avoir l'autorisation.
Marsh Posté le 04-12-2012 à 12:33:44
J'ai trouvé !
Il suffisait (exemple) :
Code :
|
J'ai toutefois une nouvelle question.
Si je détermine ceci :
Code :
|
, en cas d'erreur, un visiteur qui aurait écrit une apostrophe ("je m'appelle" ) ne verra pas apparaître : "je m / appelle". Suppression des antislashes.
Tout va bien, si ce n'est que ça ne fonctionne que pour <textarea>, pas pour les <input> !
Si un visiteur écrit "je m'appelle" dans un champ <input>, il se verra renvoyé "je m" : la chaîne sera coupée à l'endroit exact de l'apostrophe.
Une idée ?
Marsh Posté le 04-12-2012 à 13:48:29
C'est pas un comportement normal stripslashes marche sur n'importe quelle chaîne, peu importe d'où elle vient...
Par contre, le "je m" tu le vois si tu fait un echo $nom ou c'est ce qui est affiché dans ton input ? Parce que si c'est dans le 2ème cas, ça vient du fait que tu encadre la value du input avec un quote et non un guillemet
<input name="nom" type="text" value='je m'appelle' />
Tu vois qu'il y a un pb. Faut faire :
<input name="nom" type="text" value="je m'appelle" />
Et si tu as un " dans ton input faut utiliser htmlspecialchars au moment du réaffichage.
Pour rappel, faut pas confondre la valeur saisie (et stockée en base ou ailleurs) et l'affichage de la valeur saisie qui peut nécessiter un reformatage pour un affichage correct (surtout que si tu réaffiches en html, xml, csv... ça sera pas le même reformatage
Marsh Posté le 04-12-2012 à 16:00:38
Merci à toi encore Rufo pour ta science.
J'ai lu, relu et rerelu encore ton message et je ne suis pas absolument sûr de tout comprendre
Alors, je me permets d'afficher le code exact d'un de mes champs <input> (j'ai le même problème pour tous mes input, sur les deux pages de formulaires) :
Code :
|
(PS: bon, nous sommes d'accord, il y a peu de chances qu'un visiteur écrive une apostrophe dans son nom, à moins qu'il ne soit noble ou le duc d'Anjou , mais nous serons d'accord aussi je pense si je dis que c'est une grossière erreur, à corriger...)
Marsh Posté le 04-12-2012 à 16:07:29
En fait il te dit qu'il faut enlever les ' que tu as dans ton value= et les remplacer par des " comme tout les autres attributs de ta balise input.
Donc
Code :
|
Edit : Je les ai mis en rouge!
Marsh Posté le 04-12-2012 à 16:34:20
fnisse a écrit : Merci à toi encore Rufo pour ta science.
|
Côté serveur, pour récupérer la valeur du formulaire :
$nom = stripslashes(strip_tags($_POST["nom"]));
Ensuite, tu stockes $nom en BD ou dans un fichier, voire dans $_SESSION si la page qui traite le formulaire est différente de celle qui l'affiche ou le réaffiche après une erreur.
Pour le réaffichage (en cas d'erreur, par ex) :
<input name="nom" class="champ1" size="30" type="text" maxlength="40" value="<?php echo htmlspecialchars(isset($nom)) ? $nom : ''; ?>"/>
Avec ça, le gars peut mettre un guillemet, c'est pas gênant. Et pour info, des noms avec des apostrophes, c'est bien plus courant que tu sembles le croire (ex : nom belge, hollandais...).
Marsh Posté le 06-12-2012 à 20:52:49
Merci à toi Beap pour la traduction !
Cela fonctionne impeccablement !
Merci encore Rufo !
Oui, je suis quand même au courant pour les noms (J'essayais de faire un peu d'humour... )
J'ai réussi à un peu améliorer mon code (ayant notamment appris plusieurs petites choses grâce à ce tutoriel, dont j'ai appris l'existence grâce à une recherche sur ce forum concernant les mêmes sujets) et ai écrit cela :
Code :
|
Voici la fonction Validenom('nom'), qui précède et que je sais un peu ridicule puisque la clé regex est ultra-simpliste (la seule que j'ai pu écrire jusqu'ici du haut de mes toutes petites connaissances) :
Code :
|
Mon formulaire fonctionne et les espaces ne sont pas comptées : message d'erreur "écrivez votre nom" si vous tapez 2, 3 ou 100 espaces alors que le nom doit faire au moins 3 lettres. Très bien. Ensuite, en cas d'erreur, le formulaire renvoie aux inputs en effaçant ces espaces: très bien, le TRIM que j'ai ajouté fonctionne.
Mais, le problème est que si l'on tape dans le champ nom (et c'est valable également pour le "textarea", soumis à la même condition regex et au même "or empty($variable)" ) des espaces suivis d'une ou de deux lettres seulement, le formulaire est validé ! Même problème, validation et envoi, si l'on tape une lettre (alors qu'il en faut trois minimum) et qu'on tape ensuite au moins deux espaces.
En d'autres termes, les espaces ne sont pas comptées caractères entrés par l'utilisateur seulement si elles sont seules!
Je me suis donc bien entendu penché sur if (Validenom('nom')==true or empty($nom)) pour essayer de voir où le problème réside, mais sans succès.
Si le code renvoie "true" c'est que la chaîne entrée fait moins de 3 lettres et l'on a la réponse "veuillez indiquer votre nom". Cela marche puisque si je n'entre rien du tout, une lettre, deux lettres ou seulement des espaces : message d'erreur attendu.
J'ai ajouté le "or empty($variable)" pour répondre au TRIM plus haut : si le champ est seulement rempli d'espaces : message d'erreur voulu ! Donc ça marche aussi puisque si je n'avais pas écrit ce "or empty($nom)", les espaces auraient été considérées comme des caractères entrés.
Donc pourquoi un " a" ou un "a " (voyez les espaces ) est-il donc validé ??
Moins important, mais assez tout de même pour que je pose la question : comment dois-je faire pour que la page se positionne exactement sur le message de confirmation de l'envoi (ou le message d'erreur le cas échéant) et ne revienne pas tout en haut après avoir poussé sur SUBMIT ?
Merci d'avance encore!
Marsh Posté le 06-12-2012 à 21:25:42
Salut,
alors c'est normal que cela te renvoie True car dans ta fonction tu envoies 'nom' ce qui correspond à 3 caractères... il faudrait que tu envoies à ta fonction '$nom' ... tu as oublié le $.
Ensuite pour l'autre, tu appelles la fonction Validemsg alors que je pense qu'il faudrait appeler Validenom ! Maintenant je peux me tromper n'ayant pas le code entier en ma possession
Pour ce qui est de se positionner exactement sur le message de confirmation de l'envoi ou des messages d'erreurs, il faut mettre des ancres nommées.
J'espère que cela t'avancera un chouilla
Marsh Posté le 06-12-2012 à 22:16:17
Coucou Beap.
Procédons dans l'ordre et éliminons un problème ! J'ai trouvé la solution pour positionner sur le message réponse après l'envoi et non en haut de page !
1) J'ai ajouté ce petit script dans mon fichier JS :
function aps(url){
document.x.action = url;
document.x.submit();}
2) J'ai ajouté ceci dans mon Input submit : onclick="aps('#aps');"
3) Ajouté un name="x" à mon formulaire et l'ancre id="aps" là où je voulais que ça tombe
Cela fonctionne impec' !
Pour te répondre : je connais et utilise les ancres depuis très longtemps et disons que ça ne me faisait pas avancer des masses (puisque <input type="submit"> n'est pas un <href> ).
Concernant le sujet principal :
je ne suis pas sûr de te suivre...
Code :
|
D'après ce que tu dis, le résultat serait toujours "false" puisque "nom" = 3 lettres.
Pourtant, en dessous, on a :
Code :
|
Si on avait toujours "false", ma clé ne servirait à rien puisque le formulaire calculerait toujours "nom"= 3 lettres donc "return false". On ne pourrait dès lors être dans l'erreur que dans le cas où : "empty($nom)". Or, si je tape seulement deux lettres, j'obtiens le message d'erreur !
Donc je ne te suis pas du tout
PS : oublions le Textarea. Il suit exactement la même logique (et il a sa propre fonction "validemsg" qui est en fait la même que "validenom" ).
Marsh Posté le 06-12-2012 à 22:48:54
Salut,
tu as géré les ancres nommées via javascript, si ça te va c'est bien comme ça.
Ton code n'est pas du tout optimisé (on est d'accord) et les erreurs s'accumulent à force d'arranger de ça de là.
En gros avec les bribes que j'ai de ton code je n'y comprends pas grand chose, tu le conçois.
Il nous faudrait, je pense, avoir l'intégralité de ta page ou de tes pages si le formulaire en utilise plusieurs.
La chose évidente si je suis ton script c'est qu'une fonction est appelée pour contrôler si ton champ (imput ou textarea) est vide ou si il contient des données.
Là, en l'occurence ta fonction Validenom, tu envoies toujours 'nom'. Les caractère 'nom'. Ta fonction tu ne lui envoies pas le contenu de ton champs de formulaire ! Tu me suis ? C'est comme si tu notais : Validenom('des caractères') au lieu de Validenom($uneVariable). Ok ? C'est clair pour toi ?
Donc ta fonction si tu lui envoie 'nom' elle ne sera jamais vide, donc ton empty($nom) ne sers à rien car c'est comme si tu avais $nom = 'nom'; ...
Peut pas être plus clair
En plus dans ta fonction, tu reprends $_POST['nom']...
Je complète après ta réponse ^^
Envoi nous ton code !
Marsh Posté le 06-12-2012 à 23:14:34
Je t'avais bien compris la première fois cher Beap.
Par contre, je n'ai pas l'impression que tu as compris mon message.
Si l'on suit ton raisonnement, l'on aurait toujours un "return false" de la fonction "Validenom". Et si en plus le "empty(&nom)" ne sert à rien, comment se fait-il que le formulaire fonctionne, que l'on reçoive un message d'erreur si l'on entre un nom d'une ou de deux lettres seulement ?
Suivant ton raisonnement, l'on n'aurait JAMAIS de message d'erreur. "C'est clair pour toi?"
(( Concernant les ancres : j'ai peut-être géré mes ancres en JS, mais je n'ai encore lu nulle part comment je pourrais faire autrement. Tu m'as dit d'utiliser une ancre, c'est ce que j'ai fait et voulais déjà faire avant de trouver une réponse quelque part sur le Web, si ce n'est que je ne voyais pas comment agir avec <input>. Aussi, je trouve que mon code n'est pas mal optimisé du tout, et qu'il est d'ailleurs plutôt très propre, pour le site d'un non professionnel. ))
Voici la totalité de ma page :
Code :
|
Lorsque je n'écrivais pas ce "or empty($nom)" ou ce "or empty($msg)", si quelqu'un tapait 3 espaces (ou davantage), l'envoi était validé. Donc cet ajout a servi a quelque chose.
Je me permets de rappeler l'objet de mon interrogation : quelqu'un qui n'entre que des espaces aura un message d'erreur. Les espaces ne sont pas comptabilisées grâce au TRIM que j'ai ajouté, mais pourquoi un " a" ou un "a " (voyez les espaces) est-il donc validé ?
Marsh Posté le 07-12-2012 à 00:40:26
Cher François, tu as raison.
Je n'ai pas eu le courage de bien lire tes bouts de script complètement et n'ai pas vérifié que ta fonction suivant ma logique était tout le temps un "return false" et je n'ai même pas contrôlé ton expression régulière...
Donc en lisant ta page de script rapidement voici quelques corrections que tu pourrais apporter :
Au tout début :
Code :
|
Pour le reste je ne comprends pas cette histoire de TRIM
Marsh Posté le 07-12-2012 à 00:58:44
J'ai remplacé
1)
Code :
|
par
2)
Code :
|
et cela fait que la fonction n'a plus son mot à dire : si j'entre ne fût-ce qu'une lettre, ça passe.
Alors je suis revenu à 1), mon code initial.
En fait, mon code, tel que je l'ai montré dans le message précédent, fonctionne comme je le veux (et j'en viens à TRIM), puisque :
"aa" = ça ne passe pas (normal, ça fait moins de deux lettres) ;
" " = 1 espace, 2 espaces comme 17473892 espaces, ça ne passe pas (normal, puisque $nom = htmlspecialchars(stripslashes(trim($_POST['nom']))); ET QUE or empty($nom)).
Par contre, si j'entre :
"a a" (càd "aUNE_ESPACE_TYPOGRAPHIQUEa" ), cela passe, alors que je n'ai envoyé que deux lettres (< 3). Cela veut dire que TRIM fait bien son boulot, il supprime les espaces, mais qu'il est inefficace lorsque les espaces sont accompagnées de n'importe quel symbole. Cela revient à dire que l'on peut entrer une seule lettre et être validé sous la condition que l'on entre, avec cette lettre, au moins deux espaces.
Merci infiniment pour ton aide. J'espère vraiment pouvoir tirer cette histoire au clair !
Marsh Posté le 08-01-2013 à 20:42:50
fnisse a écrit : Donc pourquoi un " a" ou un "a " (voyez les espaces ) est-il donc validé ?? |
fnisse a écrit : En fait, mon code, tel que je l'ai montré dans le message précédent, fonctionne comme je le veux (et j'en viens à TRIM), puisque : |
Il est temps d'apprendre à lire et utiliser une documentation : http://fr2.php.net/manual/fr/function.trim.php
La documentation dit que trim "Supprime les espaces (ou d'autres caractères) en début et fin de chaîne".
fnisse a écrit : Mon formulaire fonctionne et les espaces ne sont pas comptées : message d'erreur "écrivez votre nom" si vous tapez 2, 3 ou 100 espaces alors que le nom doit faire au moins 3 lettres. Très bien. Ensuite, en cas d'erreur, le formulaire renvoie aux inputs en effaçant ces espaces: très bien, le TRIM que j'ai ajouté fonctionne. |
"effacer les espaces", ça se traduit par str_replace(' ', '', $subject);
"si vous tapez 2, 3 ou 100 espaces alors le nom doit faire au moins 3 lettres", ça se traduit par strlen(str_replace(' ', '', $nom)) >= 3
ou par preg_match('#^.{3,}$#', str_replace(' ', '', $nom))
ou etc.
Marsh Posté le 08-01-2013 à 23:15:57
Attention, grande phrase de la part de monsieur Chz !
Vous pourriez en fait commencer toutes vos réponses à des questions posées sur le forum par un "Il est temps de commencer par apprendre...", en considérant en effet que toute question est le fruit d'une certaine ignorance. Si le forum n'est plus l'endroit où poser ses questions, que devient-il aussi ? Cela revient à dire que votre réponse est quelque peu... idiote. Ne le prenez surtout pas trop mal : il n'y a aucune raison que ma réponse vous fâche une fois que vous aurez compris l'inanité de la vôtre. ;-)
Merci quand même pour votre réponse, bien qu'elle soit adressée sèchement.
Ce n'est cependant pas très clair (ou veuillez encore une fois m'excuser de mon ignorance en la matière) : que dois-je exactement modifier à mon code pour obtenir le résultat escompté ?
Salutations.
Marsh Posté le 14-01-2013 à 11:11:39
Bonjour,
Je pense que c'est réglé maintenant loool
Marsh Posté le 20-02-2013 à 21:49:01
if (preg_match("#.{3,}#", str_replace(' ', '', $_POST['nom'])))
Cela fonctionne, effectivement !
Merci. Sujet clos (et Tsoko, va voir au Muppet show si j'y suis ).
Marsh Posté le 03-12-2012 à 12:53:32
EDIT : Je ne le ferai pas, dès lors. (C'est pourtant toi qui m'as renseigné ce script.)
J'ai pensé à une solution qui finalement me convient mieux : je réaménage ma page de contact et ajouterai manuellement (ce qui me permet de modérer) chacun des commentaires. Je suis aussi certain de ne pas perdre mes commentaires (je connaissais quelques problèmes avec la page d'admin également, qui me supprimait parfois des messages alors que je ne faisais que rafraîchir la page) et simplifie largement mon problème. Ne connaissant que bien trop peu le PHP, il me semble que c'est ce que j'ai de mieux à faire si je veux rester au contrôle de ce que je publie.
Nouvelle question : comment faire en sorte que, en cas d'erreur, le visiteur n'ait pas à retaper son message ? En effet, celui-ci disparaît si, après envoi, il n'a pas rempli les quelques conditions (erreur dans la réécriture du captcha, p. ex.).
Voici mon livre d'or mis en place.
Tapez un court message, soumettez-le à l'envoi, constatez le message d'erreur, rafraîchissez ensuite la page à l'aide du bouton du navigateur et constatez que votre message a disparu.
Même chose en cas de rafraîchissement de la page...
Message édité par fnisse le 20-02-2013 à 21:50:26