A propos des formulaires

Résolu
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012 - 24 avril 2012 à 23:49
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012 - 29 avril 2012 à 14:08
Bonjour,
Ayant réalisé un formulaire (nom, prénom, téléphone, e-mail et message), j'essaie d'améliorer mon code de départ. Trois champs sont requis : le nom, le mail et le message que doit laisser l'internaute. J'ai placé une regex pour vérifier le format du n° de tél. Cependant, lorsque je décide de ne rien mettre dans le champ "téléphone" (et l'internaute est en droit de ne rien mettre à cet endroit car le champ n'est pas requis), le message qui annonce le mauvais "format" du téléphone apparaît (hors, j'ai spécifié au début du code que le cas à traiter était celui où la variable qui est censé accueillir le n° de tél. était spécifiée, donc contenant une donnée).
Quelqu'un aurait-il une idée de la source du problème ?

Le code :

<?php
        
        if (isset($_POST['nom']) && isset($_POST['prenom']) && isset($_POST['telephone']) && isset($_POST['mail']) && isset($_POST['texte'])) //on vérifie que la variable 'mail' contient une donnée
        {
        // On rend inoffensives les balises HTML que le visiteur a pu rentrer
        $_POST['nom'] = htmlspecialchars($_POST['nom']);
        $_POST['prenom'] = htmlspecialchars($_POST['prenom']);
        $_POST['telephone'] = htmlspecialchars($_POST['telephone']);
        $_POST['mail'] = htmlspecialchars($_POST['mail']); 
        $_POST['texte'] = htmlspecialchars($_POST['texte']);
        
        //si le téléphone n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
        if (!preg_match("#^0[1-9]([-. ]?[0-9]{2}){4}$#", $_POST['telephone']))
        {
            ?>
      <script>
            alert("le téléphone n'est pas valide ! Veuillez le saisir à nouveau.");          
            document.location.replace('contact.html');
        </script>
                
        <?php
        
        }
        //si le mail n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
        if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) 
        {
        
        ?>
      <script>
            alert("l'adresse mail n'est pas valide ! Veuillez la saisir à nouveau sous la forme aa@a.aa (de 2 à 4 lettres après le point)");          
            document.location.replace('contact.html');
        </script>
                
        <?php
        
        }
        
        
        
            ?>
        <script>
            alert("Votre demande a été prise en compte.");
            document.location.replace('site_machinTruc.html');
        </script>
            
        
        <?php                          
                  
}
       ?>

7 réponses

deutch36 Messages postés 73 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 11 décembre 2012 3
25 avril 2012 à 10:55
Bonjour à toi,

Il est normal que le numéro de téléphone soit pris en compte.

Tu test avec le if (isset()) s'il existe un champ telephone, comme lui te dit qu'il existe il avance dans le code, pour arriver a ta regex qui lui impose d'exister au format d'un numéro de téléphone.

Si tu veux que le champ est la possibilité d'être vide il faut l'indiquer.

<?php...
if (!empty($_POST['telephone'])
{
//si le téléphone n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
  if (!preg_match("#^0[1-9]([-. ]?[0-9]{2}){4}$#", $_POST['telephone']))
    {
 ?>
<script>
  alert("le téléphone n'est pas valide ! Veuillez le saisir à nouveau.");          
  document.location.replace('contact.html');
</script>
                
 <?php
        
   }
}
...?>


Code non testé mais normalement il devrait entrer dans ta regex qui si le champ numéro de téléphone n'est pas null

Désolé du double post j'avais fais une erreur dans le balisage code
3
deutch36 Messages postés 73 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 11 décembre 2012 3
25 avril 2012 à 10:51
Bonjour à toi,

Il est normal que le numéro de téléphone soit pris en compte.

Tu test avec le if (isset()) s'il existe un champ telephone, comme lui te dit qu'il existe il avance dans le code, pour arriver a ta regex qui lui impose d'exister au format d'un numéro de téléphone.

Si tu veux que le champ est la possibilité d'être vide il faut l'indiquer.

if (!empty($_POST['telephone'])
{
//si le téléphone n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
  if (!preg_match("#^0[1-9]([-. ]?[0-9]{2}){4}$#", $_POST['telephone']))
    {
 ?>
<script>
  alert("le téléphone n'est pas valide ! Veuillez le saisir à nouveau.");          
  document.location.replace('contact.html');
</script>
                
 <?php
        
   }
}


Code non testé mais normalement il devrait entrer dans ta regex qui si le champ numéro de téléphone n'est pas nul
0
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012
25 avril 2012 à 13:16
Merci deutch36, j'ai essayé, ça marche nickel !
Je pense que j'ai mal compris, au départ, la réelle portée du isset(). Je pensais qu'il signifiait "dans le cas où la variable contient qq chose". D'après ce que tu me dit, isset() signifie plutôt "dans le cas où le champ existe" (donc ici, la variable 'telephone', représentée par le "name="telephone" du formulaire), c'est bien ça ?
Du coup, pour signifier ce que je voulais dire, il fallait que j'utilise le !empty (qui signifie, cette fois, "dans le cas où la variable n'est pas vide", donc "dans le cas où la variable contient qq chose". Peux-tu me confirmer tout cela deutch36 ?

En tout cas, merci encore.
0
deutch36 Messages postés 73 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 11 décembre 2012 3
25 avril 2012 à 15:10
Oui c'est cela, le isset vérifie juste la présence de ta variable, hors un champ texte même vide te retourne quelque chose.
Donc il faut utiliser le empty (équivalent du == "")qui lui va vérifier si ta variable contient quelque chose.

Si tu veux vraiment comprendre l'utilité du isset je te conseil de tester avec des variables en GET ou alors d'utiliser des checkbox.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
deutch36 Messages postés 73 Date d'inscription mardi 22 janvier 2008 Statut Membre Dernière intervention 11 décembre 2012 3
25 avril 2012 à 15:22
Je me permets de t'ajouter un conseil ;)

Plutôt que de tester la présence de tout les champs après soumission du formulaire créer un bouton avec un nom et fais le isset dessus.

Après c'est contestable mais je trouve ca plus lisible qu'un test a rallonge ^^

if (isset($_POST['mon_bouton_de_soumission']
{
---- mon code ---
}

<form method="post" action="">
---- mes champs ----


</form>
0
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012
29 avril 2012 à 00:19
D'accord pour la différence entre isset() et empty(), c'est beaucoup plus clair désormais !
Et merci aussi pour le conseil concernant le fait de "faire" isset() uniquement sur le bouton de validation.

Par contre, un autre souci se pose (ça aurait été trop beau sinon ! ) : lorsque l'utilisateur tape un numéro de téléphone sous un mauvais format (ou un mail sous un mauvais format également d'ailleurs), le message d'erreur apparaît bien, et l'utilisateur est bien redirigé vers le formulaire...mais le mail est tout de même envoyé ! (oui depuis, j'ai rajouté une fonction mail)

if (!empty($_POST['telephone']))
            {    
                //si le téléphone n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
                if (!preg_match("#^0[1-9]([-. ]?[0-9]{2}){4}$#", $_POST['telephone'])) 
                {				
                ?>
                <script>
                    alert("le téléphone n'est pas valide ! Veuillez le saisir à nouveau.");          
                    document.location.replace('contact.html');
                </script>
                
                <?php        
                
}				
            }
            //si le mail n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
            if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail'])) 
            {        			
            ?>
            <script>
                alert("l'adresse mail n'est pas valide ! Veuillez la saisir à nouveau sous la forme aa@a.aa (de 2 à 4 lettres après le point)");          
                document.location.replace('contact.html');
            </script>
                
            <?php        
            
}     

            //-->FONCTION MAIL<--         
            $sujet = "Envoi mail";             
                
            if(mail('blublu@hotmail.fr', $sujet, $_POST['texte'])) 
            {
                echo "Le mail a été envoyé.";
            }
            else
            {
                echo"Un problème est survenu.";
            }
            ?>
            <script>
                alert("Votre demande a été prise en compte : un e-mail a été envoyé au webmaster.");
                document.location.replace('index.html');
            </script>        
            <?php


En gros, la redirection vers le formulaire n'empêche pas la machine d'exécuter le code qui suit (donc ici, l'envoi du mail). J'ai essayé de palier à cela avec différents moyens, mais sans succès jusque là...qq'un aurait une idée ?
0
atari54 Messages postés 20 Date d'inscription vendredi 11 novembre 2011 Statut Membre Dernière intervention 6 juin 2012
29 avril 2012 à 14:08
Je pense avoir trouvé la solution (en tout cas UNE solution possible) : j'ai rajouté des "die()" afin que la "machine" ne prenne pas en compte la suite du script lorsque le format du tél. et/ou du mail n'est pas le bon (et ainsi, le mail ne sera pas envoyé dans ces cas-là).

Ce qui donne :

if (!empty($_POST['telephone']))
            {    
                //si le téléphone n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
                if (!preg_match("#^0[1-9]([-. ]?[0-9]{2}){4}$#", $_POST['telephone']))
                {
                ?>
                <script>
                    alert("le téléphone n'est pas valide ! Veuillez le saisir à nouveau.");          
                    document.location.replace('contact.html');

                </script>
                
                <?php  
                die(); //si le téléphone n'est pas dans le bon format, la suite du script n'est pas exécuté
                }
            }
            //si le mail n'a pas été rentré sous la forme imposée par la regex, un script l'annonce, puis l'internaute est redirigé vers le formulaire
            if (!preg_match("#^[a-z0-9._-]+@[a-z0-9._-]{2,}\.[a-z]{2,4}$#", $_POST['mail']))
            {        
            ?>
            <script>
                alert("l'adresse mail n'est pas valide ! Veuillez la saisir à nouveau sous la forme aa@a.aa (de 2 à 4 lettres après le point)");          
                document.location.replace('contact.html');
            </script>
                
            <?php
            die(); //si le mail n'est pas dans le bon format, la suite du script n'est pas exécuté
            }    
            //-->FONCTION MAIL<--        
            $sujet = "Envoi mail";            
                
            if(mail('blublu@hotmail.fr', $sujet, $_POST['texte']))
            {
                echo "Le mail a été envoyé.";
            }
            else
            {
                echo"Un problème est survenu.";
            }
            ?>
            <script>
                alert("Votre demande a été prise en compte : un e-mail a été envoyé au webmaster.");
                document.location.replace('index.html');
            </script>        
            <?php



Cela paraît cohérent ? Des améliorations là-dessus ? Je ne demande qu'à apprendre
0
Rejoignez-nous