Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1420 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  [Résolu] Formulaire PHP : problème de TRIM

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Résolu] Formulaire PHP : problème de TRIM

n°2166381
fnisse
Posté le 03-12-2012 à 12:53:32  profilanswer
 

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
mood
Publicité
Posté le 03-12-2012 à 12:53:32  profilanswer
 

n°2166401
windux
Posté le 03-12-2012 à 15:09:26  profilanswer
 

Je pense que tu ne devrais pas poster de script dont tu n'es pas l'auteur, à moins d'en avoir l'autorisation.

n°2166605
fnisse
Posté le 04-12-2012 à 12:33:44  profilanswer
 

J'ai trouvé !
Il suffisait (exemple) :  

Code :
  1. d'écrire
  2. <input name="nom" type="text" value='<?php echo isset($nom) ? $nom : ''; ?>' />
  3. à la place de
  4. <input name="nom" type="text" />


J'ai toutefois une nouvelle question.
 
Si je détermine ceci :  

Code :
  1. $nom = htmlspecialchars(stripslashes($_POST['nom']));

, 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 ?


Message édité par fnisse le 04-12-2012 à 12:35:39
n°2166624
rufo
Pas me confondre avec Lycos!
Posté le 04-12-2012 à 13:48:29  profilanswer
 

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 ;)


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2166686
fnisse
Posté le 04-12-2012 à 16:00:38  profilanswer
 

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 :
  1. <input name="nom" class="champ1" size="30" type="text" maxlength="40" value='<?php echo isset($nom) ? $nom : ''; ?>' />


 
(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...)

Message cité 1 fois
Message édité par fnisse le 04-12-2012 à 16:03:17
n°2166688
Buldozerbe​n
Shizofan !
Posté le 04-12-2012 à 16:07:29  profilanswer
 

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 :
  1. <input name="nom" class="champ1" size="30" type="text" maxlength="40" value="<?php echo isset($nom) ? $nom : ''; ?>"/>
 

Edit : Je les ai mis en rouge!


Message édité par Buldozerben le 04-12-2012 à 16:08:20

---------------
Topic Ach/Vds/Ech jeux vidéo
n°2166691
rufo
Pas me confondre avec Lycos!
Posté le 04-12-2012 à 16:34:20  profilanswer
 

fnisse a écrit :

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 :
  1. <input name="nom" class="champ1" size="30" type="text" maxlength="40" value='<?php echo isset($nom) ? $nom : ''; ?>' />


 
(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...)


 
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...).


---------------
Astres, outil de help-desk GPL : http://sourceforge.net/projects/astres, ICARE, gestion de conf : http://sourceforge.net/projects/icare, Outil Planeta Calandreta : https://framalibre.org/content/planeta-calandreta
n°2167142
fnisse
Posté le 06-12-2012 à 20:52:49  profilanswer
 

Merci à toi Beap pour la traduction !   :pt1cable:  
Cela fonctionne impeccablement !   :ouch:  
Merci encore Rufo !
Oui, je suis quand même au courant pour les noms ;) (J'essayais de faire un peu d'humour... :love:)
 
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 :
  1. if(isset($_POST['valider']))
  2. {
  3. $nom = htmlspecialchars(stripslashes(trim($_POST['nom'])));
  4. $msg = htmlspecialchars(stripslashes(trim($_POST['msg'])));
  5. if (!chk_crypt($_POST['code']))
  6. {
  7. $message .="<span class='fot gras'>recopier correctement le cryptogramme&#x202f;?&nbsp;</span>";
  8. }
  9. if (Validenom('nom')==true or empty($nom))
  10. {
  11. $message .="<span class='fot gras'>indiquer un nom afin que je puisse vous citer&#x202f;?&nbsp;</span>";
  12. }
  13. if (Validemsg('msg')==true or empty($msg))
  14. {
  15. $message .="<span class='fot gras'>prononcer au moins une syllabe&#x202f;?</span>";
  16. }
  17. if (strlen($message) > strlen($msg_erreur))
  18. {
  19. echo $message;
  20. }
  21. else
  22. {
  23. foreach($_POST as $index => $valeur)
  24. {
  25. Code de l'envoi....


 
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 :
  1. function Validenom($nom)
  2. {
  3. if (preg_match("#.{3,}#", $_POST['nom']))
  4. {
  5. return false;
  6. }
  7. else
  8. {
  9. return true;
  10. }
  11. }


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!

n°2167143
Buldozerbe​n
Shizofan !
Posté le 06-12-2012 à 21:25:42  profilanswer
 

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  :D


---------------
Topic Ach/Vds/Ech jeux vidéo
n°2167144
fnisse
Posté le 06-12-2012 à 22:16:17  profilanswer
 

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 :
  1. function Validenom($nom)
  2. {
  3. if (preg_match("#.{3,}#", $_POST['nom']))
  4. {
  5. return false;
  6. }
  7. else
  8. {
  9. return true;
  10. }
  11. }


D'après ce que tu dis, le résultat serait toujours "false" puisque "nom" = 3 lettres.
Pourtant, en dessous, on a :

Code :
  1. if (Validenom('nom')==true or empty($nom))


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" ).


Message édité par fnisse le 06-12-2012 à 22:26:21
mood
Publicité
Posté le 06-12-2012 à 22:16:17  profilanswer
 

n°2167145
Buldozerbe​n
Shizofan !
Posté le 06-12-2012 à 22:48:54  profilanswer
 

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'; ...  [:aloy]  
 
Peut pas être plus clair  [:airforceone]  
 
En plus dans ta fonction, tu reprends $_POST['nom']...  [:anshi]  
 
Je complète après ta réponse ^^
Envoi nous ton code !


---------------
Topic Ach/Vds/Ech jeux vidéo
n°2167146
fnisse
Posté le 06-12-2012 à 23:14:34  profilanswer
 

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?"  :sol:  
 
(( 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 :
  1. <?php
  2. $cryptinstall="./medias/crypt/cryptographp.fct.php";
  3. include $cryptinstall;
  4. function Validenom($nom)
  5. {
  6. if (preg_match("#.{3,}#", $_POST['nom']))
  7. {
  8. return false;
  9. }
  10. else
  11. {
  12. return true;
  13. }
  14. }
  15. function Validemsg($msg)
  16. {
  17. if (preg_match("#.{3,}#", $_POST['msg']))
  18. {
  19. return false;
  20. }
  21. else
  22. {
  23. return true;
  24. }
  25. }
  26. ?>
  27. <?php
  28. include 'blablabla.php';
  29. ?>
  30. <title>Livre d'or &ndash; F. Nisse, expert</title>
  31. <meta name="description" content="Livre d'or de François Nisse. Laissez-moi toutes vos remarques, tous vos commentaires." />
  32. <?php
  33. include 'blablabla.php';
  34. ?>
  35. <div id="parall">
  36. <h1 class="leg2"><strong>Livre d'or&nbsp;: vos impressions importent</strong></h1>
  37. <table class="livor1">
  38. //Toute ma table ici. Pas important.
  39. </table>
  40. <form name="x" method="post" action="/livredor.php">
  41. <?php
  42. echo("<p class='bonetfot' id='aps'>" );
  43. $msg_ok = "<span class='bon gras'>Merci $nom, votre message m'a bien été transmis. Il appara&icirc;tra dans le livre aussit&ocirc;t qu'il aura été validé.</span>";
  44. $msg_erreur = "<span class='fot gras'>Attention&nbsp;: pouvez-vous&nbsp;</span>";
  45. $message = $msg_erreur;
  46. if(isset($_POST['valider']))
  47. {
  48. $nom = htmlspecialchars(stripslashes(trim($_POST['nom'])));
  49. $msg = htmlspecialchars(stripslashes(trim($_POST['msg'])));
  50. if (!chk_crypt($_POST['code']))
  51. {
  52. $message .="<span class='fot gras'>recopier correctement le cryptogramme&#x202f;?&nbsp;</span>";
  53. }
  54. if (Validenom('nom')==true or empty($nom))
  55. {
  56. $message .="<span class='fot gras'>indiquer un nom afin que je puisse vous citer&#x202f;?&nbsp;</span>";
  57. }
  58. if (Validemsg('msg')==true or empty($msg))
  59. {
  60. $message .="<span class='fot gras'>prononcer au moins une syllabe&#x202f;?</span>";
  61. }
  62. if (strlen($message) > strlen($msg_erreur))
  63. {
  64. echo $message;
  65. }
  66. else
  67. {
  68. foreach($_POST as $index => $valeur)
  69. {
  70. $$index = stripslashes(trim($valeur));
  71. }
  72. $mail_entete = "MIME-Version: 1.0\r\n";
  73. $mail_entete .= "From: {$_POST['nom']}"
  74. ."<{$_POST['email']}>\r\n";
  75. $mail_entete .= 'Content-Type: text/plain; charset="utf-8"';
  76. $mail_entete .= "\r\nContent-Transfer-Encoding: 8bit\r\n";
  77. $mail_entete .= 'X-Mailer:PHP/' . phpversion()."\r\n";
  78. $mail_corps = "De la part de : $nom\n";
  79. $mail_corps .= "Message sur livre dor : $msg";
  80. if ($_POST['valider']==true && mail(MAIL_DESTINATAIRE,MAIL_SUJET,$mail_corps,$mail_entete))
  81. {
  82. echo $msg_ok;
  83. }
  84. }
  85. }
  86. echo("</p>" );
  87. ?>
  88. <label class="formn" id="ajout">Votre nom ou un pseudo&nbsp;:</label>
  89. <input class="champ champx gras" name="nom" size="30" maxlength="40" type="text" value="<?php echo isset($nom) ? $nom : ''; ?>" />
  90. <br />
  91. <label class="formn">Votre message&nbsp;:</label>
  92. <br />
  93. <textarea class="champ gras" name="msg" cols="55" rows="10" maxlength="20000"><?php echo isset($msg) ? $msg : ''; ?></textarea>
  94. <br /><br />
  95. <table>
  96. <tr>
  97. <td><?php dsp_crypt(0,1); ?></td>
  98. <td><input name="code" id="status" type="text" value="Recopiez le code" onclick="this.value=''" /></td>
  99. </tr>
  100. </table>
  101. <br />
  102. <input name="valider" type="submit" value="Soumettre" onclick="aps('#aps');" />
  103. </form>
  104. </div>
  105. <?php
  106. include 'blablabla.php';
  107. ?>
  108. </body>
  109. </html>


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é ?


Message édité par fnisse le 06-12-2012 à 23:29:44
n°2167147
Buldozerbe​n
Shizofan !
Posté le 07-12-2012 à 00:40:26  profilanswer
 

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 :
  1. <?php
  2.     $cryptinstall="./medias/crypt/cryptographp.fct.php";
  3.     include $cryptinstall;
  4.     function Validenom($controlNom)
  5.     {
  6.     if (preg_match("#.{3,}#", $controlNom))
  7.     {
  8.      return false;
  9.     } else {
  10.      return true;
  11.     }
  12.     }
  13. function Validemsg($controlMsg)
  14.     {
  15.     if (preg_match("#.{3,}#", $controlMsg))
  16.     {
  17.      return false;
  18.     } else {
  19.      return true;
  20.     }
  21.     }
  22.     ?>


 
Pour le reste je ne comprends pas cette histoire de TRIM  [:airforceone]


---------------
Topic Ach/Vds/Ech jeux vidéo
n°2167148
fnisse
Posté le 07-12-2012 à 00:58:44  profilanswer
 

J'ai remplacé
1)

Code :
  1. function Validenom($nom)
  2. {
  3. if (preg_match("#.{3,}#", $_POST['nom']))

par
2)

Code :
  1. function Validenom($controlNom)
  2. {
  3. if (preg_match("#.{3,}#", $controlNom))

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 !

Message cité 1 fois
Message édité par fnisse le 08-12-2012 à 11:17:23
n°2170291
fnisse
Posté le 08-01-2013 à 19:07:33  profilanswer
 

Rafraîchissement !

n°2170306
czh
Posté le 08-01-2013 à 20:42:50  profilanswer
 

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 :
"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.


 
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.

n°2170317
fnisse
Posté le 08-01-2013 à 23:15:57  profilanswer
 

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.

n°2171027
tsoko
Posté le 14-01-2013 à 11:11:39  profilanswer
 

Bonjour,
Je pense que c'est réglé maintenant loool :)


---------------
Besoin d'aide pour votre projet? agence web
n°2176698
fnisse
Posté le 20-02-2013 à 21:49:01  profilanswer
 

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  :hello:).


Message édité par fnisse le 20-02-2013 à 21:49:43

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  [Résolu] Formulaire PHP : problème de TRIM

 

Sujets relatifs
[PHP / JS] C'est un script jquery qui fait ce truc en première page ?[PHP] Aide pour un preg_replace, caractère de fin ]
Afficher correctement du code PHP "littéral"Récupérer une URL en PHP contenue dans une page
[PHP] SSO avec LDAPCréer une liste numérotée en PHP
PDO PHPPHP, cookie, path.
PHP - Contact Management (tri, catégories ...)Questions à propos des DLLs
Plus de sujets relatifs à : [Résolu] Formulaire PHP : problème de TRIM


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR