Bonsoir je suis en train de m’entraîner sur PHP, j'ai créé une function pour vérifier les champs d'un formulaire d'inscription, et j'aimerais avoir d'abord votre avis sur mon code ainsi que des suggestions pour améliorer le code.

Page inscription :

<?php
include "function/inscription.class.php";
var_dump($_POST);
if(isset($_POST'username']) && isset($_POST'password']) && isset($_POST'passwordconfirm']) && isset($_POST'email'])){
    $inscription = new inscription($_POST'username'],$_POST'password'],$_POST'passwordconfirm'], $_POST'email'], $_POST'emailconfirm']);
    $verif = $inscription->verif();
    if($verif == "ok"){
        echo 'ok';
    }else{
        $errors = $verif;
    }
}
?>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <link rel="stylesheet" href="css/style.css">
        <style type="text/css">
        body{margin: 0px;padding: 0px;background:;}
        label{float: left;display: block;width: 200px;}
        </style>
    </head>
    <body>
        <div class="wrap">
            <h2>Inscription</h2>
            <div class="form-groupe">
                <div class="error">
                    <?php
                    if(isset($errors)){
                        echo "$errors <br />";
                    }
                    ?>
                </div><br />
                <form method="post" action="index.php">
                    <div class="input">
                        <label for="username">Votre nom d'utilisateur :</label>
                        <input type="text" name="username" id="username" placeholder="Votre nom d'utilisateur">
                    </div>
                    <div class="input">
                        <label for="password">Votre mot de passe :</label>
                        <input type="password" name="password" id="password" placeholder="Votre mot de passe">
                    </div>
                    <div class="input">
                        <label for="passwordconfirm">Confirmer le mot de passe :</label>
                        <input type="password" name="passwordconfirm" id="passwordconfirm" placeholder="Confirmer le mot de passe">
                    </div>
                    <div class="input">
                        <label for="email">Votre adresse email :</label>
                        <input type="text" name="email" id="email" placeholder="Votre adresse email">
                    </div>
                    <div class="input">
                        <label for="emailconfirm">Confirmer l'email :</label>
                        <input type="text" name="emailconfirm" id="emailconfirm" placeholder="Confirmer votre email">
                    </div>
                    <div class="input">
                        <input type="submit" value="s'inscrire">
                    </div>
                </form>
            </div>
        </div>
    </body>
</html>

inscription.class.php :

<?php
class inscription{
    private $username;
    private $password;
    private $passwordconfirm;
    private $email;
    private $emailconfirm;
    public function __construct($username, $password, $passwordconfirm, $email, $emailconfirm){
        $this->username = $username;
        $this->password = $password;
        $this->passwordconfirm = $passwordconfirm;
        $this->email = $email;
        $this->emailconfirm = $emailconfirm;
    }
    public function verif(){
        if(!empty($this->username)){
            if(strlen($this->username)> 5 AND strlen($this->username)<20){
                if(!empty($this->password)){
                    if(strlen($this->password)> 8 AND strlen($this->password)< 20){
                        if($this->password == $this->passwordconfirm){
                            if(!empty($this->email)){
                                $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';
                                if(preg_match($regex, $this->email)){
                                    if($this->email == $this->emailconfirm){
                                        return 'ok';
                                    }else{
                                        $errors = "Les deux adresses email ne corresponde pas";
                                        return $errors;
                                    }
                                }else{
                                    $errors = "La syntaxe de l'adresse email est incorrect";
                                    return $errors;
                                }
                            }else{
                                $errors = "Veuillez choisir une adresse email";
                                return $errors;
                            }
                        }else{
                            $errors = "Les deux mots de passe ne corresponde pas";
                            return $errors;
                        }
                    }else{
                        $errors = "Le mot de passe dois contenir entre 8 et 20 caractéres";
                        return $errors;
                    }
                }else{
                    $errors = "Veuillez choisir un mot de passe";
                    return $errors;
                }
            }else{
                $errors = "Le nom d'utiliasateur dois contenir entre 5 et 20 caractéres";
                return $errors;
            }
        }else{
            $errors = "Veuillez choisir un nom d'utiliasateur";
            return $errors;
        }
    }
}

Voilà merci de vos futures réponses.

13 réponses


Je suis un peu perdu sur la contenance de la variable $errors je dois avoué ... j'aurais plus fait de cette manière :

$errors = array();
if (sarkozy != hollande)
{
 array_push($errors,'erreur politique');
}

De ce fait, pour afficher toutes les erreurs, un petit

foreach($errors as $e)

Bonsoir merci de votre commentaire mais je ne vois pas trop comment faire votre méthode vue que je suis encore débutant j'ai encore des choses à apprendre, si vous pourriez me donner un exemple se serait vraiment sympa

Bonsoir,

Meme code mais 100 fois plus lisible

public function verif() {

        $errors = '';
        $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';

        if (empty($this->username)) {
            $errors = "Veuillez choisir un nom d'utiliasateur";
        }
        else if (strlen($this->username) < 6 || strlen($this->username) > 19) {
            $errors = "Le nom d'utiliasateur dois contenir entre 5 et 20 caractéres";
        }
        else if (empty($this->password)) {
            $errors = "Veuillez choisir un mot de passe";
        }
        else if (strlen($this->password) < 9 || strlen($this->password) > 19) {
            $errors = "Le mot de passe dois contenir entre 8 et 20 caractéres";
        }
        else if ($this->password != $this->passwordconfirm) {
            $errors = "Les deux mots de passe ne corresponde pas";
        }
        else if (empty($this->email)) {
            $errors = "Veuillez choisir une adresse email";
        }
        else if (!preg_match($regex, $this->email)) {
            $errors = "La syntaxe de l'adresse email est incorrect";
        }
        else if ($this->email != $this->emailconfirm) {
            $errors = "Les deux adresses email ne corresponde pas";
        }

        if (empty($errors))
        {
            return 'ok';
        }

        return $errors;
    }

ou sinon avec la méthode multiples erreurs

public function verif() {

        $errors = array();
        $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';

        if (empty($this->username)) {
            $errors] = "Veuillez choisir un nom d'utiliasateur";
        }
        else if (strlen($this->username) < 6 || strlen($this->username) > 19) {
            $errors] = "Le nom d'utiliasateur dois contenir entre 5 et 20 caractéres";
        }
        if (empty($this->password)) {
            $errors] = "Veuillez choisir un mot de passe";
        }
        else if (strlen($this->password) < 9 || strlen($this->password) > 19) {
            $errors] = "Le mot de passe dois contenir entre 8 et 20 caractéres";
        }
        if ($this->password != $this->passwordconfirm) {
            $errors] = "Les deux mots de passe ne corresponde pas";
        }
        if (empty($this->email)) {
            $errors] = "Veuillez choisir une adresse email";
        }
        else if (!preg_match($regex, $this->email)) {
            $errors] = "La syntaxe de l'adresse email est incorrect";
        }
        if ($this->email != $this->emailconfirm) {
            $errors] = "Les deux adresses email ne corresponde pas";
        }

        if (empty($errors))
        {
            return 'ok';
        }

        return $errors;

        //ou si tu ne veux pas de tableau en retour

        return implode('<br/>', $errors);
    }

Bon maintenant, les conseilles

  • pour tester l'email utilise filter_var avec FILTER_VALIDATE_EMAIL comme filtre.

  • pour le mot de passe, utilise une regex, sinon tu vas te retrouver avec des mots de passe contentant des espaces ou d'autres trucs très bizarre.

Cordialement,

Bonsoir merci de votre aidait elle m'a été d'une grande aide, j'ai pu comprendre pas mal de mes erreurs, je vais utiliser Reg ex pour les mots de passe :)

Cordialement.

Taksone.... ....ses ps le sujet mais bon --"

Hey!
150 fois plus lisible..

<?php
public function verif() {
    $regex = '/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/';

    if (empty($this->username)) {
        return = "Veuillez choisir un nom d'utiliasateur";
    }else if (!preg_match("#.{7,18}#", $this->username)) {
        return = "Le nom d'utiliasateur dois contenir entre 5 et 20 caractéres";
    }else if (empty($this->password)) {
        return = "Veuillez choisir un mot de passe";
    }else if (!preg_match("#.{10,18}#", $this->password)) {
        return = "Le mot de passe dois contenir entre 8 et 20 caractéres";
    }else if ($this->password != $this->passwordconfirm) {
        return = "Les deux mots de passe ne corresponde pas";
    }else if (empty($this->email)) {
        return = "Veuillez choisir une adresse email";
    }else if (!preg_match($regex, $this->email)) {
        return = "La syntaxe de l'adresse email est incorrect";
    }else if ($this->email != $this->emailconfirm) {
        return = "Les deux adresses email ne corresponde pas";
    }else{
        return 'ok';
    }
}
?>

250 Fois plus lisible :

Bah non...

(Ceci est un troll bien-sûr)
Peut-importe qui à le plus lisible, Graphi débute en PHP, donc essayer d'argumenter vos code :)

Fais-toi des méthodes utilitaires pour simplifier la lecture du code...

Validation::stringNonVide($string); // Retourne possiblement un booléen...
Validation::stringSelonRegex($regex, $string);
...

Enfin bon, tu peux choisir si tu veux écrire son code en français ou en anglais mais bon... voilà. :-)

Oooooh p**ain, Ramzz tu ma donnée une idée de génie !!
Merci :D

Je suis content de l'apprendre. :-)
PS : j'ai dit que la fonction pouvait possiblement retourner un booléen... enfin, ce n'est pas très important vu que PHP est un langage orienté sur le typage dynamique (en gros, tu ne définit pas nécessairement un type de retour). D'ailleurs, Je ne voulais pas « imposer » une façon de faire en utilisant des méthodes statiques... tu peux aussi bien utiliser une instance d'une classe de validation, mais bon, à toi de voir le meilleur design. (peut-être un hiérarchie de classes de validation...) Je ne connais pas nécessairement les spécificités au niveau de PHP (polymorphisme, classes abstraites, interfaces, etc.)

:-)

Merci Ramzz, l'explication servira pour Graphi :p, car je suis déjà assez avancer mais merci infiniment pour ton idée ^^

<?php
class Test {
    public static function vide($string) {
        if($string != NULL) {
            print('Remplie');
        } else {
            print('Vide !');
        }
    }
}
$test = new Test();
$test::vide('Blabla'); //Retourne remplie
$test::vide(); //Retourne vide

Partant de ce que tu as écris, j'aurais probablement écrire ceci :

<?php 
class Validation
{
    public static function estVide($string)
    {
        return empty($string) ? false : true;
    }
}
Validation::estVide("...") // true
Validation::estVide(""); // false
?>

Pour ce qui mettre une valeur par défaut au paramètre string (ce que tu n'as pas fait, mais ce que tu veux faire), je doute que ça soit vraiment utile. Je tiens à dire que NULL != "".

Il n'a pas besoin d'instance dans un contexte statique. :-)

Ramz.

Effectivement plus simple ^^