Partage
  • Partager sur Facebook
  • Partager sur Twitter

J'ai testé la POO, votre avis?

Suis-je sur la bonne voie ou alors fais-je n'importe quoi ^_^

    20 juillet 2018 à 14:42:17

    Edit: le code ne s'est pas indenté, je ne sais pas pourquoi :s

    Bonjour,

    Je fais ce sujet car j'ai récemment commencé à apprendre la programmation orientée objet.

    J'ai +- compris le principe mais je n'ai pas du tout l'habitude du coup j'aimerais avoir un retour sur ce que j'ai fais, histoire de savoir si c'est +- cohérent et pour éviter de continuer de la sorte si je fais n'importe quoi :-°

    Bon pour l'instant il n'y a pas grand chose (juste un formulaire pour s'inscrire), mais je pense que vous saurez tout de suite si c'est bon ou pas bon.

    index.php:

    <?php
    require_once 'global.php';
    
    use App\App;
    use App\FormManager;
    
    $app = new App();
    $app->loadPage();
    
    $formManager = new FormManager($database);
    
    if($formManager->isSubmit('submit-regist') == true) {
        /* L'utilisateur a cliqué sur le bouton submit */
    
        /* On vérifie que le pseudo fait entre 3 et 25 caractèes */
        $formManager->checkLength('pseudo', 3, 25);
        /* On vérifie que le mdp fait entre 6 et 25 caractères */
        $formManager->checkLength('password', 6, 25);
        /* On vérifie le format de l'adresse email */
        $formManager->checkMail('email');
        /* On vérifie que l'adresse email n'existe pas */
        $formManager->checkMailExist('email');
        /* On hash le password */
        $pwd = $formManager->hash('password');
        /*  On enregistre le membre
            La fonction affiche l'erreur et n'enregistre pas le membre
            Si il y a une erreur au dessus  */
        $formManager->regist($_POST['pseudo'], $_POST['email'], $pwd);
    }



    Dans le global.php il y a l'autoloader des classes + la variable $database qui contient PDO. (J'ai vu que ce n'était pas une bonne idée de créer une classe pour la base de donnée, j'aimerais votre avis la dessus car pour utiliser PDO justement, je ne savais pas trop comment faire du coup j'ai très possiblement fais n'importe quoi)

    Ma classe App c'est pas opti du tout, mais bon c'était pour le plaisir d'avoir une classe App:

    <?php
    
    namespace App;
    
    class App {
        private $header;
        private $page;
        private $footer;
    
        public function __construct()
        {
            $this->header = 'header.html.php';
            $this->footer = 'footer.html.php';
            $this->page = basename($_SERVER['PHP_SELF'], '.php');
        }
    
        public function loadPage()
        {
            include('src/'.$this->header);
            include('src/'.$this->page.'.html.php');
            include('src/'.$this->footer);
        }
    }



    Et ma classe FormManager:

    <?php
    
    namespace App;
    
    class FormManager Extends Manager {
        /**
         * @var string
         */
        private $error = null;
        protected $database;
    
        /**
         * @param $submit_name
         * @return bool
         */
    
        public function __construct($database = null)
        {
            parent::__construct($database);
        }
    
        public function isSubmit($submit_name) {
            if(isset($_POST[$submit_name])) {
                return true;
            } else {
                return false;
            }
        }
    
        /**
         * @param $champ_name string
         * @param $min_length int
         * @param $max_length int
         * @return mixed|string
         */
        public function checkLength($champ_name, $min_length, $max_length) {
            if(strlen($_POST[$champ_name]) < $min_length) {
                $this->setError("Trop petit");
                return $this->getError();
            } elseif(strlen($_POST[$champ_name]) > $max_length) {
                $this->setError("Trop grand");
                return $this->getError();
            } else {
                return true;
            }
        }
    
        public function checkMail($champ_email) {
            if(filter_var($_POST[$champ_email], FILTER_VALIDATE_EMAIL)) {
                return true;
            } else {
                $this->setError("Email non valide");
                return $this->getError();
            }
        }
    
        public function checkMailExist($champ_email) {
            $count = $this->database->query("SELECT * FROM users WHERE email = '$_POST[$champ_email]'")->rowCount();
            if($count > 0) {
                $this->setError("L'adresse email existe déjà");
                return $this->getError();
            } else {
                return true;
            }
        }
    
        public function hash($string) {
            $str = parent::hash($_POST[$string]);
            return $str;
        }
    
        public function regist($pseudo, $email, $password) {
            if(is_null($this->error)){
                $req = $this->database->prepare("INSERT INTO users (pseudo, email, password) VALUES (:pseudo, :email, :password)");
                $req->execute(array(
                    ':pseudo' => $pseudo,
                    ':email' => $email,
                    ':password' => $password
                ));
            } else {
                echo $this->getError();
            }
        }
    
        public function checkPass($password_name, $email_name) {
            $basePwd = $this->database->query("SELECT password FROM users WHERE email = '$_POST[$email_name]'")->fetch();
            $postPwd = $this->hash($_POST[$password_name]);
            var_dump($postPwd);
            var_dump($basePwd);
            if($basePwd === $postPwd) {
                echo "ok";
            }
        }
        /**
         * @return mixed
         */
        public function getError() {
            if(!empty($this->error)) {
                return $this->error;
            }
        }
    
        /**
         * @param mixed $error
         */
        public function setError($error)
        {
            $this->error = $error;
        }
    }

    Et la classe Manager :

    <?php
    
    namespace App;
    
    class Manager {
        protected $database;
    
        public function __construct($database = null) {
            $this->database = $database;
        }
    
        public function hash($string) {
            return password_hash($string, PASSWORD_DEFAULT);
        }
    }



    Voilà, j'espère que vous avez de bon conseils surtout pour utiliser PDO dans une classe ^^

    Merci!

    -
    Edité par NewUser() 20 juillet 2018 à 14:43:33

    • Partager sur Facebook
    • Partager sur Twitter
      20 juillet 2018 à 15:06:49

      Salut !

      NewUser() a écrit:

      le code ne s'est pas indenté, je ne sais pas pourquoi :s

      Parce que tu l'as copié-collé comme corps de message sans utiliser l'outil de présentation de code : le bouton </>. En gros, tu as eu un peu de chance que l'éditeur WYSIWYW ait pris ta coloration syntaxique et que le thème Sunburn n'ait pas de texte en blanc, du moins pas dans ce que tu as fourni. Corrige la présentation du code EN ÉDITANT TON MESSAGE s'il te plaît, l'indentation apparaîtra et la coloration syntaxique ne risque plus de poser problème.

      • Partager sur Facebook
      • Partager sur Twitter
        20 juillet 2018 à 16:42:08

        Bonjour,

        Message édité avec code lisible ;)

        • Partager sur Facebook
        • Partager sur Twitter
        Seul on va plus vite, ensemble on va plus loin ... A maîtriser : Conception BDD, MySQL, PHP/MySQL

        J'ai testé la POO, votre avis?

        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
        • Editeur
        • Markdown