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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    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
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 49
    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.

  3. #3
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    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 418
    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 éclairé
    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
    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 éclairé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    49
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 49
    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

  6. #6
    Expert confirmé

    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2010
    Messages
    5 418
    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 418
    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
    Membre Expert
    Avatar de laurentSc
    Homme Profil pro
    Webmaster débutant perpétuel !
    Inscrit en
    Octobre 2006
    Messages
    10 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Isère (Rhône Alpes)

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

    Informations forums :
    Inscription : Octobre 2006
    Messages : 10 493
    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']) != '')

+ Répondre à la discussion
Cette discussion est résolue.

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