IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage PHP Discussion :

empêcher l'enregistrement dans ma bdd de données non valides


Sujet :

Langage PHP

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut empêcher l'enregistrement dans ma bdd de données non valides
    Bonjour à tous,
    Je suis débutant en php et j'essaie de contrôler les données fournies par un formulaire et tout spécialement le numéro de téléphone avant enregistrement dans la bdd.
    Malheureusement, je constate qu'il enregistre les numéros valides mais également invalides. Une âme généreuse et indulgente pourrait-il consulter mon code et m'indiquer par exemple si le numtel n'est pas valide que faut-il faire et où insérer ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    <p>
    <?php
    if (isset($_POST['numtel']))
    {
        $_POST['numtel'] = htmlspecialchars($_POST['numtel']); // On rend inoffensives les balises HTML que le visiteur a pu rentrer
     
        if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']))
     
        {
            echo 'Le ' . $_POST['numtel'] . ' est un numéro <strong>valide</strong> !';
        }
        else
        {
     
           echo 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';
        }
    }	
      ?>
     
    <form method="post">
    <p>
        <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
        <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
        <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
     
     
     <input type="submit" value="Envoyer" />
    </p>
        </form>
     
    	<?php
    	// Connexion à la base de données
    try
    {
        $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
        $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
     
     
     
        // Insertion du message à l'aide d'une requête préparée
    $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
        $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
    // Redirection du visiteur vers la page du minichat
     
     //*   header('Location: CodePHPTelephone.php');*//
    }
    catch(Exception $e)
    {
        die('Erreur : '.$e->getMessage());
    }
    ?>
    Sincères remerciements
    Claudine

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 49
    Points : 89
    Points
    89
    Par défaut
    Bonsoir,

    A première vue, quand la valeur est invalide, le programme continue quand même après le if.

    Il faudrai placer le bloc try qui s'occupe de l'insersion dans le if après la ligne 10. ou alors terminer le script quand une valeur est invalide.

    En effet, si une ligne invalide est entrée, on sort du if puis on fait l'insersion dans la base quand même.


    Après pour garantir l'insertion correcte dans tous les scripts, le meilleur moyen est de mettre une contrainte de table au niveau de la abse de données. C'est à dire que la table n'acceptera de faire l'insertion que si le numero est valide par exemple. Ainsi si ton programme php tente d'insérer une valeur non valide, le sgbd renverra une erreur.

    Par contre je ne sais pas si les contraintes de table existent sous mysql, peut être regarder du côté des trigger sinon.
    Au commencement Dieu a crée l'Homme, puis l'Homme a crée la machine, puis l'Homme a tué Dieu. Fou de rage, Dieu a envoyé à l'Homme l'Informatique pour le punir de son orgueil.


    Le libéralisme économique est une conjecture qui énonce que tout ensemble de classes tend à constituer un programme cohérent et stable.

  3. #3
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Quest-ce que fait là ton enregistrement en bdd après le formulaire. Pourquoi est-il placé à cet endroit ?

    Logiquement ce devrait être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    <?php
    if (isset($_POST['numtel']))
    {
        if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']))
     
        {
                // Connexion à la base de données
         try
             {
              $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
              $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
              // Insertion du message à l'aide d'une requête préparée
              $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
              $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
              // Redirection du visiteur vers la page du minichat
     
     //*   header('Location: CodePHPTelephone.php');*//
            }
            catch(Exception $e)
           {
            die('Erreur : '.$e->getMessage());
           }
        }
        else
        {
     
           echo 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';
        }
    }	
      ?>
     
    <form method="post">
    <p>
        <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
        <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
        <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
     
     
     <input type="submit" value="Envoyer" />
    </p>
        </form>
    Et pas besoin de faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    $_POST['numtel'] = htmlspecialchars($_POST['numtel']);
    puisque le preg_match fait le tri juste après.

  4. #4
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut
    Bonjour à tous,
    Vous êtes sympa les gars! Voilà 15 jours de temps perdu et grâce à vous, le problème est résolu.
    Cependant, je me pose deux questions:
    1)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']))
    cette ligne me permet d'introduire les codes téléphoniques pour GSM(mobile) en belgique
    exemple: 0477 06 05 87
    Mais, je dois modifier ce code pour pouvoir introduire les N° de téléphone fixe Belge par le code suivant
    Exemple: 02 385 06 32 ou encore 015 20 85 33
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel']))
    N'est-il pas possible de reprendre les deux possibilités en une seule ligne de code? où bien dois-je prévoir deux colonnes séparées dans la table(nuumtelFixe, numtelMobile).
    2)htmlspecialchars: le cours php pour débutant me dit de ne pas oublier de protéger avec cette expression.
    Pourriez-vous m'expliquer car je ne comprend pas très bien l'utilité de cette expression?
    Sincères remerciements pour votre aide précieuse
    Claudine

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 49
    Points : 89
    Points
    89
    Par défaut
    htmlspecialchar empêche un utilisateur de mettre du code html à la place de son nom ou de son prénom.

    Si jamais par exemple il est possible pour les visiteurs de voir les derniers inscrits, quelqu'un pourrait s'inscrire sous le nom "<script>un méchant script ...<script>". Ce code serait vu et donc affiché sur le navigateur de tes visiteurs.

    Un bon point déjà, tu utilise PDO, tu ne risque donc pas d'injections SQL.

    Par contre tu doit vérifier pour chaque champ si il est valide, le nom et le prénom aussi. Dans le doute mieux vaut le faire systématiquement, d'ailleurs si le risque n'est pas présent au moment ou tu code, ça peut le devenir quand ton site évolue.

    Le mieux est d'utiliser les filtres : http://fr.php.net/manual/fr/book.filter.php
    Au commencement Dieu a crée l'Homme, puis l'Homme a crée la machine, puis l'Homme a tué Dieu. Fou de rage, Dieu a envoyé à l'Homme l'Informatique pour le punir de son orgueil.


    Le libéralisme économique est une conjecture qui énonce que tout ensemble de classes tend à constituer un programme cohérent et stable.

  6. #6
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Claudine Voir le message
    2)htmlspecialchars: le cours php pour débutant me dit de ne pas oublier de protéger avec cette expression.
    UNIQUEMENT pour l'AFFICHAGE de code php donc quand tu fais un echo, soit echo htmlspecialchars($mavariable). Hors ici tu n'affiche rien.

    Concernant tes expressions régulières c'est l'une ou l'autre, donc cela peut s'écrire comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (preg_match("#^0[1-68]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel']))
    Si tu veux contrôler les noms et prénoms (genre faut pas qu'il soient vides) tu peux faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['nom']) && trim($_POST['nom']) != '')
    Alternativement pour filtrer, tu peux aussi regarder le lien de nonolagalinette mais je connais peu de gens (et peu d'exemples de code) qui utilisent ces machins là. A part le filtre FILTER_VALIDATE_EMAIL le reste est d'un intérêt relatif.

  7. #7
    Expert confirmé
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 386
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Webmaster débutant perpétuel !
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 386
    Points : 5 733
    Points
    5 733
    Billets dans le blog
    1
    Par défaut
    ABCIWEB, à quoi sert le trim dans cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['nom']) && trim($_POST['nom']) != '')
    Il vaut mieux viser la perfection et la manquer que viser l'imperfection et l'atteindre. - Bertrand Russell

    Si la discussion est résolue, merci de cliquer sur le bouton

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut
    Bonjour ABCIWEB

    Merci pour ces derniers conseils et tout fonctionne à merveille.
    Mais dès que je veux introduire le contrôle des champs vides pour les champs nom et prénom, plus rien ne fonctionne(même plus les numtel) avec messages successifs d'erreur. Je patauge et suis proche du découragement, à croire que je ne peux rien faire seul. Puis-je vous demander une fois de plus d'introduire la ligne de code proposée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['nom']) && trim($_POST['nom']) != '')
    avec indication du message d'erreur 'veuillez indiquer votre nom ou votre prénom' en cas de champ vide dans le programme ci-dessous:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
     
    <?php
     
    if (isset($_POST['numtel']))
     
    {
       if (preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel']))
     
     
     
                // Connexion à la base de données
         try
             {
              $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
              $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
              // Insertion du message à l'aide d'une requête préparée
              $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
              $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
              // Redirection du visiteur vers la page duformulaire//
     
      header('Location: CodePHPTelephone.php');
            }
            catch(Exception $e)
           {
            die('Erreur : '.$e->getMessage());
           }
        }
        else
        {
    	   echo 'Le ' . $_POST['nom'] . ' n\'est pas indiqué, recommencez !';
         }
     
     
    	 {
    	 echo 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';  
     
        }
     
     
     
      ?>
     
    <form method="post">
    <p>
        <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
        <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
        <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
     
     
     <input type="submit" value="Envoyer" />
    </p>
        </form>
    Mes plus vifs remerciements
    Claudine

  9. #9
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Voilà une méthode classique qui consiste à imbriquer le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    <?php
    $message = array();
     
    if(isset($_POST['envoyer']))
    {
        if (isset($_POST['nom']) && trim($_POST['nom']) != '')
        {
    	    if (isset($_POST['numtel']) && trim($_POST['numtel']) != '')
    	    {
    	       if (preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel']))
    		{
     
    		     // Connexion à la base de données
    		     try
    			 {
    			      $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    			      $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
    			      // Insertion du message à l'aide d'une requête préparée
    			      $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
    			      $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
    			      // Redirection du visiteur vers la page duformulaire//
     
    			      header('Location: CodePHPTelephone.php');
    			}
    		    catch(Exception $e)
    		       {
    			    die('Erreur : '.$e->getMessage());
    		       }
    		}
    		else
    		{
    		     $message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';   
    		}
    	    }
    	    else
    	    {
    		$message[] = 'Le champ téléphone est vide, remplissez-le !';  
    	    }  
        }
        else
        {
    	$message[] = 'Veuillez indiquer votre nom';
        }
    }
    ?>
     
    <form method="post">
    <p>
        <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
        <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
        <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
     
     
     <input type="submit" name = "envoyer" value="Envoyer" />
     
    </p>
    </form>
    <?php
    if(isset($message) && count($message) > 0)
    {
    foreach($message as $value) echo '<p>'.$value.'</p>';
    }
    ?>
    (il reste le prénom à imbriquer)

  10. #10
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par laurentSc Voir le message
    ABCIWEB, à quoi sert le trim dans cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (isset($_POST['nom']) && trim($_POST['nom']) != '')
    Et si tu regardais dans le manuel ? trim

  11. #11
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Voici une autre méthode parfois plus facile à écrire et qui utilise moins l'imbrication :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    <?php
     
     
    $message = array();
     
    if (isset($_POST['envoyer']))
     
    {
     
    	if (!(isset($_POST['nom']) && trim($_POST['nom']) != ''))
    	{
    		$message[] = 'Veuillez indiquer votre nom';
    	}
     
     
    	if (!(isset($_POST['numtel']) && trim($_POST['numtel']) != ''))	 
    	{
    		$message[] = 'Veuillez indiquer un numéro de téléphone';
    	}
    	else
    	{
    		if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel'])))
    		{
    			$message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';   
    		}
    	}
     
     
    	if (!(isset($_POST['prenom']) && trim($_POST['prenom']) != ''))
    	{
    		$message[] = 'Veuillez indiquer votre prénom';
    	}
     
     
    	if (isset($message) && count($message) == 0)
    	{
    		 // Connexion à la base de données
    		 try
    			 {
    			  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    			  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
    			  // Insertion du message à l'aide d'une requête préparée
    			  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
    			  $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
    			  // Redirection du visiteur vers la page duformulaire//
     
    				header('Location: CodePHPTelephone.php');
    			}
    		catch(Exception $e)
    		   	{
    				die('Erreur : '.$e->getMessage());
    		   	}
    	}
    }
    ?>
    <form method="post">
    <p>
        <label for="nom">Votre nom ?</label> <input id="nom" name="nom" /><br />
        <label for="prenom">Votre prenom ?</label> <input id="prenom" name="prenom" /><br />
        <label for="numtel">Votre téléphone ?</label> <input id="numtel" name="numtel" /><br />
     
     
     <input type="submit" name = "envoyer" value="Envoyer" />
    </p>
    </form>
    <?php
    if(isset($message) && count($message) > 0)
    {
    foreach($message as $value) echo '<p>'.$value.'</p>';
    }
    ?>

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut
    Bonjour ABCIWEB,
    je tiens à vous remercier pour cet exemple qui fonctionne très bien.
    Mais une fois de plus, moins d'imbrication ou pas, j'essaie depuis ce matin d'y ajouter une ligne de code pour empêcher l'introduction de chiffres dans le nom (en plus du champ vide)et tout est boulversé avec erreur de tout genre. Exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    if (!preg_match("^[a-zçèéë]{2,20}$",$_POST['nom']))
    	     die("le nom ne doit contenir que des lettres");
    Que dire si je dois faire la même chose pour le prénom!
    De plus, est-il possible de garder en mémoire les valeurs tapées lorsque le formulaire réapparait car c'est fastidieux de toujours recommencer. J'y ai ajouter : mais rien n'y fait.
    Je suis probablement irrécupérable! Pitié pour un vrai débutant ou plus tôt incompétent! Puis-je une fois de plus, vous demander votre aide?
    Mille remerciements
    Claudine

  13. #13
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Claudine Voir le message
    Bonjour ABCIWEB,
    je tiens à vous remercier pour cet exemple qui fonctionne très bien.
    Mais une fois de plus, moins d'imbrication ou pas, j'essaie depuis ce matin d'y ajouter une ligne de code pour empêcher l'introduction de chiffres dans le nom (en plus du champ vide)et tout est boulversé avec erreur de tout genre.
    Il y a un exemple qui utilise deux conditions - champ rempli et champ contrôlé par un regex (preg_match) - avec numtel :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    //...
    	if (!(isset($_POST['numtel']) && trim($_POST['numtel']) != ''))	 
    	{
    		$message[] = 'Veuillez indiquer un numéro de téléphone';
    	}
    	else
    	{
    		if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $_POST['numtel'])))
    		{
    			$message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas valide, recommencez !';   
    		}
    	}
    //...
    Il te suffit de prendre modèle dessus pour faire la même chose avec le nom et éventuellement le prénom (en remplaçant le filtre du preg_match et en n'en gardant qu'un car apparemment il n'y aura pas besoin de deux successifs pour faire ton contrôle) .

    Essaies de faire marcher cela ensuite on verra pour éviter de re remplir le formulaire en cas d'erreur.

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut
    Bonjour ABCIWeb,
    Merci à l'excellent pédagogue, tout fonctionne normalement.
    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (!preg_match("^[a-zçèéë]{2,20}$",$_POST['nom']))
    ne fonctionne pas, il réclame un délimiteur de fin(^), de plus il n'accepte pas les crochets{2,20} ainsi que $
    J'ai donc remplacé par:
    Le
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     if (!preg_match("^[A-Za-zçèéë]^",$_POST['nom']))
    Ce code ne me paraît pas parfait car, il n'accepte pas de chiffres en début de frappe mais il accepte comme nom: jean456.
    Comment puis-je obtenir un nom composé uniquement de lettres(alpha) avec en plus une majuscule comme première lettre.?
    Voulez-vous m'aider une fois de plus?
    J'ai réussi (avec l'aide du forum) à mémoriser les champs du formulaire et je compte bien publier(pour les novices comme moi) l'ensemble quand j'estimerai que c'est valable.
    Un grand merci pour votre aide précieuse
    Claudine

  15. #15
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Citation Envoyé par Claudine Voir le message
    Bonjour ABCIWeb,
    Merci à l'excellent pédagogue, tout fonctionne normalement.
    Ben alors mets un point (votes pouce +) pour les messages qui t'ont aidés

    Concernant ton regex, le motif pour trouver que des lettres y compris des lettres accentuées (rajoutes celles dont tu as besoin et qui ne sont pas dans ma liste à la suite des premières déjà indiquées) est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    preg_match('#^[a-zéèàçïêë]{3,8}$#i',$nom)
    i c'est pour faire des recherches sur les minuscules et les majuscules
    {3,8} c'est pour dire entre 3 et 8 caractères
    et si l'expression est entourée par ^ et $, le masque concerne la chaine de caractère complète.

    Tu as un tuto ici

    Bon il te manque la première lettre en majuscule, mais ça tu n'es pas obligée de le considérer comme une faute puisque tu peux très bien le faire automatiquement en php avec la fonction ucfirst

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut
    Bonjour ABCIWEB,
    Formidable, excellents conseils qui m'ont permis de mieux comprendre le fonctionnement.
    Quand à: je vous cite:Bon il te manque la première lettre en majuscule, mais ça tu n'es pas obligée de le considérer comme une faute puisque tu peux très bien le faire automatiquement en php avec la fonction ucfirst
    La nuit porte conseils mais malheureusement je n'y suis pas arrivé!
    Mais comment faire passer nom et prénom dans cette fonction avant d'enregistrer dans la base de données? $nom= valeur du formulaire? et où situer ce code dans le programme ci-dessous?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    <?php
    $message = array();
     
    if (isset($_POST['envoyer'])) 
    {
     
        /* Récupération des valeurs des champs du formulaire */
        if (get_magic_quotes_gpc())
        {
     
          $nom	     	= stripslashes(trim($_POST['nom']));
     
          $prenom		= stripslashes(trim($_POST['prenom']));
          $numtel	= stripslashes(trim($_POST['numtel']));
        }
           else
           {
     
               $nom	        = trim($_POST['nom']);
     
               $prenom	    = trim($_POST['prenom']);
               $numtel      = trim($_POST['numtel']);
            }
    //....
    	    if (!(isset($_POST['nom']) && trim($_POST['nom']) != ''))
    	    {
    		     $message[] = 'Veuillez indiquer votre nom';
    	    }
             else    
            { 
    	      	      if (! preg_match('#^[a-zéèàçïêë]{3,12}$#i',$nom))	 
    	         {
    	              $message[] = 'Le ' . $_POST['nom'] . ' n\'est pas                   valide, recommencez !';   
     
                 }
             }
    //......
     
     
     
    ?>
    <?php
    //...
    	      if (!(isset($_POST['numtel']) && trim($_POST['numtel']) != ''))	 
    	      {
    		      $message[] = 'Veuillez indiquer un numéro de téléphone';
    	      }
    	      else
    	      {
    		        if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $_POST              ['numtel']) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#",              $_POST['numtel'])))
    		      {
    			       $message[] = 'Le ' . $_POST['numtel'] . ' n\'est pas                    valide, recommencez !';   
    		      }
    	      }
     
    //...	
    	      if (!(isset($_POST['prenom']) && trim($_POST['prenom']) != ''            ))
    	      {
    		            $message[] = 'Veuillez indiquer votre prénom';
    	      }
    	        else    
              { 
     
    	           if (!preg_match('/^[\p{L} ]+$/u',$_POST['prenom'])) 
     
    	         {
    	              $message[] = 'Le ' . $_POST['prenom'] . ' n\'autorise                  que des lettres, recommencez !'; 
    			  }  
    	       }
    	       if (isset($message) && count($message) == 0)
    	      {
    		       // Connexion à la base de données
    		 try
    			 {
    			  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    			  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
    			  // Insertion du message à l'aide d'une requête préparée
    			  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
    			  $req->execute(array($_POST['nom'], $_POST['prenom'], $_POST['numtel']));
    			  // Redirection du visiteur vers la page duformulaire//
     
    				header('Location: ChampVVM.php');
    			 }
    		catch(Exception $e)
    		   	 {
    				die('Erreur : '.$e->getMessage());
    		   	 }
    }
    }	
     
    ?>
    <form method="post">
        <p>
            <label for="nom">Votre nom :</label>
     
             <input type="text" id="nom" name="nom" 
     
            value="<?php echo (isset($_POST['nom'])) ?$nom : '' ?>"  
     
            />
        </p>
        <p>
            <label for="prenom">Votre prenom :</label>
            <input type="text" id="prenom" name="prenom" 
            value="<?php echo (isset($_POST['prenom'])) ? $prenom : '' ?>" 
            />
        <p>
            <label for="numtel">Votre N°de téléphone :</label>
            <input type="text" id="numtel" name="numtel" 
            value="<?php echo (isset($_POST['numtel'])) ? $numtel : '' ?>" 
            />
        </p>
     
     
     <input type="submit" name = "envoyer" value="Envoyer" />
    </p>
    </form>
    <?php
    if(isset($message) && count($message) > 0)
    {
    foreach($message as $value) echo '<p>'.$value.'</p>';
    }
    ?> __________________
    Rappel utile pour les débutants: ces codes permettent de traquer les champs vides, invalides(rien que des lettres) pour les champs Nom et prénom, ainsi que des N° de téléphone ou GSM(Belge) et mise en mémoire des valeurs tapées dans les champs du formulaire.

    Mes plus vifs remerciements à vous ABSCWEB
    Claudine

  17. #17
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Voilà une version presque optimisée de ton code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    <?php
     
    if (isset($_POST['envoyer'])) 
    {
     
    	function Verif_magicquotes ($chaine)
    	    {
    	        if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
     
    	        return $chaine;
    	    } 
     
     
    	$message = array();
     
    	$nom = isset($_POST['nom']) && trim($_POST['nom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['nom']))) : null;
     
    	$prenom = isset($_POST['prenom']) && trim($_POST['prenom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['prenom']))) : null;
     
    	$numtel = isset($_POST['numtel']) && trim($_POST['numtel']) != '' ? Verif_magicquotes(trim($_POST['numtel'])) : null;
     
     
     
    	if (! isset($nom))
    		{
    			 $message[] = 'Veuillez indiquer votre nom';
    		}
    	else    
    		{ 
    			if (! preg_match('#^[a-zéèàçïêë]{3,12}$#i',$nom))	 
    			 {
    				  $message[] = 'Le '. $nom .' n\'est pas valide, recommencez !';   
    			 }
    		 }
     
     
     
    	if (! isset($numtel))	 
    		{
    			$message[] = 'Veuillez indiquer un numéro de téléphone';
    		}
    	else
    		{
    			if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $numtel) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $numtel)))
    				{
    					$message[] = 'Le '. $numtel .' n\'est pas valide, recommencez !';   
    				}
    		}
     
     
     
    	if (! isset($prenom))
    		{
    			$message[] = 'Veuillez indiquer votre prénom';
    		}
    	else    
    		{ 
    			if (!preg_match('/^[\p{L} ]+$/u',$prenom)) 
    				{
    					$message[] = 'Le '.$prenom.' n\'autorise que des lettres, recommencez !'; 
    				}  
    		}
     
     
     
    	if (isset($message) && count($message) == 0)
    		{
    			 // Connexion à la base de données
    			 try
    				 {
    				  $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
    				  $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
    				  // Insertion du message à l'aide d'une requête préparée
    				  $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
    				  $req->execute(array($nom, $prenom, $numtel));
    				  // Redirection du visiteur vers la page duformulaire//
     
    					header('Location: ChampVVM.php');
    				 }
    			catch(Exception $e)
    				 {
    					die('Erreur : '.$e->getMessage());
    				 }
    		}
    }	
     
    ?>
    <form method="post">
        <p>
            <label for="nom">Votre nom :</label>
     
             <input type="text" id="nom" name="nom" 
     
            value="<?php echo (isset($_POST['nom'])) ? $nom : '' ?>"  
     
            />
        </p>
        <p>
            <label for="prenom">Votre prenom :</label>
            <input type="text" id="prenom" name="prenom" 
            value="<?php echo (isset($_POST['prenom'])) ? $prenom : '' ?>" 
            />
        <p>
            <label for="numtel">Votre N°de téléphone :</label>
            <input type="text" id="numtel" name="numtel" 
            value="<?php echo (isset($_POST['numtel'])) ? $numtel : '' ?>" 
            />
        </p>
     
     
     <input type="submit" name = "envoyer" value="Envoyer" />
    </p>
    </form>
    <?php
    if(isset($message) && count($message) > 0)
    {
    foreach($message as $value) echo '<p>'.$value.'</p>';
    }
    ?>
    Quand je dis presque c'est que si tu fais un rafraichissement de la page suite à une erreur dans le renseignement des champs, tu auras un message d'alerte du navigateur te disant qu'il faut re soumettre le formulaire pour afficher la page.

    Pour éviter cela il faut enregistrer les messages d'erreurs et le contenu du post dans une variable de session, et faire une redirection sur la page en cours à l'aide d'un header (si les champs ne sont pas correctement remplis).

    Bon ce sera l'objet de mon prochain message, en attendant je te laisse comprendre celui-ci

    EDIT : à y regarder de plus près je me demande pourquoi le filtre du preg_match pour le prénom est différent de celui pour le nom ?

    EDIT2 : Il y avait une erreur car tu enregistrais les $_POST non modifiés dans ta bdd, alors qu'il faut enregistrer les valeurs modifiées soit $nom, $prenom et $numtel. Je n'avais pas vu cette erreur car je ne teste pas l'enregistrement en Bdd

  18. #18
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Avec le code précédent, après l'affichage d'un message d'erreur généré par notre code (ex: champ non convenablement rempli etc.), un message du genre
    "Pour afficher cette page, les informations précédemment transmises par Firefox doivent être renvoyées... "
    sera affiché dans un pop up javascript par le navigateur (ici Firefox) en cas de rafraîchissement de la page en cours, ou de retour arrière à l'aide du bouton du navigateur une fois le formulaire validé.

    Ce problème vient du fait de l'affichage direct de la page suite à un post (après l'affichage d'un message d'erreur généré par notre code).

    Pour contourner ce problème on utilise maintenant un header
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Location: '.$_SERVER['PHP_SELF']);
    qui redirige vers la page en cours en cas d'erreur dans le formulaire.

    Et pour garder en mémoire (suite à cette redirection) le contenu des champs du formulaire et nos messages d'alerte, on enregistre ces variables dans des variables de session.

    Le code précédent et celui ci-dessous sont très proches puisque j'ai simplement :

    1/ déclaré l'ouverture d'une session (pour faire fonctionner mes variables de sessions)

    2/ assigné $message à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['post_form']['message_form']
    3/ enregistré les variables $_POST dans 4/ fais une redirection vers la page en cours si count($message) > 0

    5/ Utilisé pour afficher les valeurs correspondantes dans le code html.

    Après une erreur dans le renseignement des champs du formulaire, vous pouvez désormais rafraîchir la page sans soucis ou utiliser la touche retour arrière du navigateur une fois le formulaire validé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    <?php
    if (!session_id()) session_start();//déclare l'ouverture d'une session si aucune n'a été déclarée auparavant.
     
    if (isset($_POST['envoyer'])) 
    {
     
        function Verif_magicquotes ($chaine)// fonctin qui applique stripslashes si get_magic_quotes_gpc() est activé
        {
        if (get_magic_quotes_gpc()) $chaine = stripslashes($chaine);
     
        return $chaine;
        } 
     
     
        $message = array();// Pour enregistrer les messages d'information
        $_SESSION['post_form']['message'] =& $message;// avec & on assigne $message à $_SESSION['post_form']['message'] c.a.d. tout changement dans $message sera répercuté dans $_SESSION['post_form']['message']
     
        $_SESSION['post_form']['nom'] = $nom = isset($_POST['nom']) && trim($_POST['nom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['nom']))) : null;//ucfirst pour convertir le première lettre en majuscule
     
        $_SESSION['post_form']['prenom'] = $prenom = isset($_POST['prenom']) && trim($_POST['prenom']) != '' ? Verif_magicquotes(ucfirst(trim($_POST['prenom']))) : null;//ucfirst pour convertir le première lettre en majuscule
     
        $_SESSION['post_form']['numtel'] = $numtel = isset($_POST['numtel']) && trim($_POST['numtel']) != '' ? Verif_magicquotes(trim($_POST['numtel'])) : null;
     
     
     
     
        if (isset($nom))
            {
                if (! preg_match('#^[a-zéèàçïêë ]{3,12}$#i',$nom))     
                    {
                        $message[] = 'Le nom "'.$nom.'" n\'est pas valide. Ce champ n\'autorise que des lettres. Minimum 3 lettres, maximum 12. Recommencez !';   
                    }
            }
        else    
            {
                 $message[] = 'Veuillez indiquer votre nom'; 
            }
     
     
     
        if (isset($prenom))
            {
                if (! preg_match('#^[a-zéèàçïêë ]{3,12}$#i',$prenom)) 
                    {
                        $message[] = 'Le prénom "'.$prenom.'" n\'est pas valide. Ce champ n\'autorise que des lettres. Minimum 3 lettres, maximum 12. Recommencez !';   
                    }  
            }
        else    
            { 
                $message[] = 'Veuillez indiquer votre prénom';
            }
     
     
     
        if (isset($numtel))     
            {
                if (!(preg_match("#^0[1-8]([-. ]?[0-9]{2}){4}$#", $numtel) || preg_match("#^0[1-8]([-. ]?[0-9]{1}){7}$#", $numtel)))
                    {
                        $message[] = 'Le numéro de télélphone "'.$numtel.'" n\'est pas valide, recommencez !';   
                    }
            }
        else
            {
                $message[] = 'Veuillez indiquer un numéro de téléphone';        
            }
     
     
     
        if ($message && count($message) == 0)
            {
                //Effacement éventuel des variables de session (ou ne pas effacer si l'on veut garder les champs de formulaires remplis suite à une redirection sur cette même page)
                //unset($_SESSION['post_form']);
     
     
                // Connexion à la base de données
                try
                     {
                      $pdo_options[PDO::ATTR_ERRMODE] = PDO::ERRMODE_EXCEPTION;
                      $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '', $pdo_options);
     
                      // Insertion du message à l'aide d'une requête préparée
                      $req = $bdd->prepare('INSERT INTO numtel (nom, prenom, numtel) VALUES(?, ?, ?)');
                      $req->execute(array($nom, $prenom, $numtel));
     
     
                        header('Location: ChampVVM.php');
                        exit;
                     }
                catch(Exception $e)
                     {
                        die('Erreur : '.$e->getMessage());
                     }
            }
            else
            {
                header('Location: '.$_SERVER['PHP_SELF']);// redirige vers la page en cours en cas d'erreur (count($message) > 0)
                exit;
            }
    }    
     
    ?>
     
    <form method="post" action="#">
    <div>
        <p>
            <label for="nom">Votre nom :</label>
            <input type="text" id="nom" name="nom" 
            value="<?php echo (isset($_SESSION['post_form']['nom'])) ? $_SESSION['post_form']['nom'] : '' ?>"  
            />
        </p>
        <p>
            <label for="prenom">Votre prenom :</label>
            <input type="text" id="prenom" name="prenom" 
            value="<?php echo (isset($_SESSION['post_form']['prenom'])) ? $_SESSION['post_form']['prenom'] : '' ?>" 
            />
        </p>
        <p>
            <label for="numtel">Votre N°de téléphone :</label>
            <input type="text" id="numtel" name="numtel" 
            value="<?php echo (isset($_SESSION['post_form']['numtel'])) ? $_SESSION['post_form']['numtel'] : '' ?>" 
            />
        </p>
     
     <input type="submit" name = "envoyer" value="Envoyer" />
     
    </div>
    </form>
     
    <?php
    if(isset($_SESSION['post_form']['message']) && count($_SESSION['post_form']['message']) > 0)
    {
        foreach($_SESSION['post_form']['message'] as $value) echo '<p>- '.$value.'</p>';
    }
    ?>
    Remarque :

    - J'aurais pu ne pas utiliser la variable "$nom" et travailler uniquement avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['post_form']['nom']
    mais j'ai gardé cette façon de faire pour garder plus d'analogie avec le précédent code et aussi pour qu'il soit plus facile à lire (idem pour $prenom et $numtel).
    Et c'est pour cette même raison de lisibilité que $message à été assigné à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $_SESSION['post_form']['message'] (
    plutôt que de traîner dans tout le code php cette variable à rallonge).

    J'aurais pu également utiliser une variable de session pour chaque variable ex :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $_SESSION['nom'] = $nom; $_SESSION['prenom'] = $prenom;
    etc. Mais il faut éviter de multiplier le nombre (espace de nom) de variables de sessions car elles sont communes non pas simplement au script en cours mais à tous les scripts du site qui les utilisent. Avec cette méthode de les mettre dans un tableau je n'ai utilisé qu'une seule variable : et donc il est plus facile d'éviter les éventuels conflits avec d'autres scripts du site qui auraient des noms de variables de session identiques.

  19. #19
    Membre régulier
    Profil pro
    Inscrit en
    Février 2008
    Messages
    293
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2008
    Messages : 293
    Points : 95
    Points
    95
    Par défaut
    Bonjour ABCIWEB,
    Quel travail et grand merci pour les explications que je vais étudier de très près. Voulez-vous regarder où se situe le problème qui bloque l'envoi à la bdd.
    Je m'explique:
    Si je complète le formulaire avec des données valables, dès que je clic sur envoyer, il me réaffiche le formulaire comme si il avait erreur et sans messages d'erreur(ce qui est normal) et si je clique une fois de plus sur envoyer rien ne se passe.
    Il reste bloqué sur ce formulaire.
    En résumé: il me redirige vers la page en cours en cas d'erreur alors qu'il n'y a pas d'erreur!

    Sincères salutations
    Claudine

  20. #20
    Expert éminent sénior

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2010
    Messages : 5 382
    Points : 10 410
    Points
    10 410
    Par défaut
    Actuellement une fois les tests vérifiés cela te dirige à cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    header('Location: ChampVVM.php');
    donc vers ChampVVM.php. Changes le nom de ce fichier si tu souhaites qu'il te redirige ailleurs.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 3 123 DernièreDernière

Discussions similaires

  1. Réponses: 6
    Dernier message: 17/07/2008, 14h02
  2. Réponses: 2
    Dernier message: 11/06/2007, 23h23
  3. [Conception] Pb d insertion dans une BDD des données d un formulaire
    Par xtiand4 dans le forum PHP & Base de données
    Réponses: 16
    Dernier message: 02/06/2006, 18h18
  4. [MySQL] Enregistrer dans une base de données à partir d'une liste déroulante
    Par snakejl dans le forum PHP & Base de données
    Réponses: 12
    Dernier message: 17/05/2006, 16h32
  5. inscription via le web et enregistrement dans une base de données
    Par titoenis dans le forum Balisage (X)HTML et validation W3C
    Réponses: 11
    Dernier message: 17/05/2006, 09h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo