• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Czy w kodzie jest jakiś błąd ?

42 Warsaw Coding Academy
0 głosów
134 wizyt
pytanie zadane 30 listopada 2020 w PHP przez mat19 Obywatel (1,580 p.)

Czy mógłby ktoś ocenić czy w kodzie nie ma błędu, jest to walidacja formularza rejestracyjnego.

<?php

interface ABC{
    public function validateLogin();
    public function validatePassword();
    public function validatePasswordRepeat();
    public function validateName();
    public function validateUsername();
    public function validatePhone();
    public function validateEmail();
    public function validateDate();
    public function Insert();
    
    
    
    
}


class UserValidation extends database implements ABC{
    private $data;
    private $errors = '';
    private static $fields = ['login', 'password', 'password_repeat', 'first_name', 'last_name', 'email', 'number_phone', 'birth_date', 'gender', 'avatar' ];
    
    
    public function __construct($fields)
    {
        $this->data = $fields;
    }
    
    
    public function validateLogin()
    {
        $val = $this->data['login'];
        
        if(empty($val)){
            return $this->errors = "Podaj login";
        }
        else if(!preg_match('/^[a-zA-Z-0-9]{4,12}$/', $val)){
        return $this->errors = "login musi mieć od 4 do 12 znaków";
        }else
        {
            $sql = $this->connect()->prepare("SELECT * FROM users where login = :login");
            $sql->bindParam(':login', $val, PDO::PARAM_STR);
            $sql->execute();        

                 if($sql->rowCount()){
                     return $this->errors = "Podany login już istnieje";
                 }
        }
            
    }
    
    public function validatePassword()
    {
        $val = trim($this->data['password']);
        
        if(empty($val))
        {
            return $this->errors = 'Podaj hasło';
        }
        else if(!empty($val) && !preg_match('/^[A-Za-z][A-Za-z0-9]{5,31}$/', $val))
        {
            return $this->errors = 'Hasło musi zawierać przynajmniej 6 znaków i zaczynać się od litery';
        }
    }

    public function validatePasswordRepeat()
    {
        $val = trim($this->data['password_repeat']);
        $vala = trim($this->data['password']);
    
        if(empty($val))
        {
            return $this->errors = 'Pole nie może być puste';
        }
        else if($val!=$vala)
        {
            return $this->errors = 'Hasła nie są identyczne';
        }
    }
    
    
    public function validateName()
    {
        $val = trim($this->data['first_name']);
        
        if(empty($val))
        {
            return $this->errors = "Podaj imię";
        }
        else if(!preg_match('/^[a-zA-Z-0-9]{3,12}$/', $val))
        {
            return $this->errors = "Niepoprawne imię";
        }
        
    }
    
    public function validateUsername()
    {
        $val = trim($this->data['last_name']);
        
        if(empty($val))
        {
            return $this->errors = "Podaj nazwisko";
        }
        else if(!preg_match('/^[a-zA-Z-0-9]{3,12}$/', $val))
        {
        return $this->errors = "Niepoprawne nazwisko";
        }    
    }
    
    public function validatePhone()
    {
        $val = trim($this->data['number_phone']);
        
        if(empty($val))
        {
            return $this->errors = "Podaj numer telefonu";
        }else if(!preg_match('/^[0-9]{9}+$/', $val))
        {
            return $this->errors = "Niepoprawny numer";
        }else
        {
                $sql = $this->connect()->prepare("SELECT * FROM users where number_phone = :number_phone");
            $sql->bindParam(':number_phone', $val, PDO::PARAM_INT);
            $sql->execute();        

                 if($sql->rowCount()){
                     return $this->errors = "Podany numer już istnieje";
                 }
        }            
    }
    
    public function validateEmail()
    {
        $val = filter_var($this->data['email'], FILTER_SANITIZE_EMAIL);
        
        if(empty($val))
        {
            return $this->errors = "Podaj email";
        }else if(!filter_var($val, FILTER_VALIDATE_EMAIL))
        {
            return $this->errors = "Niepoprawny email";
        }else
        {
            $sql = $this->connect()->prepare("SELECT * FROM users where email = :email");
            $sql->bindParam(':email', $val, PDO::PARAM_STR);
            $sql->execute();        

                 if($sql->rowCount()){
                     return $this->errors = "Podany email już istnieje";
                 }
        }        
    }
    
    public function validateDate()
    {
        $val = trim($this->data['birth_date']);
        
        if(empty($val))
        {
            return $this->errors = "Wybierz datę urodzenia";
        }else
         echo $this->data['birth_date'];            
    }
    
    public function validateGender()
    {
        $val = trim($this->data['gender']);
        
        if(empty($val))
        {
            return $this->errors = "Wybierz płeć";
        }    
    }
    
    public function validateImage()
    {
        $val = trim($this->data['avatar']);
        
        if(empty($val)){
            return $this->errors = "Wybierz awatar";
        }
        
        
    }
    
    public function Insert()
    {
        $field1 = $this->data['login'];
        $field2 = $this->data['password'];
        $field3 = $this->data['first_name'];
        $field4 = $this->data['last_name'];
        $field5 = $this->data['email'];
        $field6 = $this->data ['birth_date'];
        $field20 = date("Y-m-d");
        $field100 = date('H:i:s');
        $field30 = strtotime($field6);
        $field40 = strtotime($field20);
        $age = $field40-$field30;
        $age10 = $age/(60*60*24*365);
        $field7 = $this->data['gender'];
        $field8 = $this->data['number_phone'];
        $field9 = $this->data['gender'];
        $field10 = $this->data['avatar'];
        
        
        $hash = password_hash($field2, PASSWORD_DEFAULT);
    
    
    if(empty($this->errors))
    {
    $sql = $this->connect()->prepare("INSERT INTO users(`login`, `password`, `first_name`, `last_name`, `email`, `birth_date`, `age`, `number_phone`, `gender`, `avatar`) VALUES(:login, :password, :first_name, :last_name, :email, :birth_date, :age, :number_phone, :gender, :avatar)");
    $sql->bindParam(':login', $field1, PDO::PARAM_STR);
    $sql->bindParam(':password', $hash, PDO::PARAM_STR);
    $sql->bindParam(':first_name', $field3, PDO::PARAM_STR);
    $sql->bindParam(':last_name', $field4, PDO::PARAM_STR);
    $sql->bindParam(':email', $field5, PDO::PARAM_STR);
    $sql->bindParam(':birth_date', $field6, PDO::PARAM_STR);
    $sql->bindParam(':gender', $field7, PDO::PARAM_STR);
    $sql->bindParam(':age', $age10, PDO::PARAM_INT);
    $sql->bindParam(':number_phone', $field8, PDO::PARAM_INT);
    $sql->bindParam(':avatar', $field10, PDO::PARAM_STR);
    $sql->execute();
    
    $query = $this->connect()->prepare("INSERT INTO statystics(`date_registration`, `time_registration`) VALUES(:date_registration, :time_registration)");
    $query->bindParam(':date_registration', $field20, PDO::PARAM_STR); 
    $query->bindParam(':time_registration', $field100, PDO::PARAM_STR);     
    $query->execute();
        
    }else
        echo "BLAD zapytania";
          
    }  
}

?>

 

1 odpowiedź

+3 głosów
odpowiedź 2 grudnia 2020 przez Assasz Nałogowiec (30,460 p.)
1. Łamiesz SRP - klasa posiada wiele odpowiedzialności, a powinna mieć tylko jedną - walidację danych. Zdecydowanie taka klasa nie powinna rozszerzać klasy Database. Jako programiści modelujemy rzeczywiśtość - co ma wspólnego warstwa persystencji z walidacją danych? Są to dwa oddzielne byty. Jeśli potrzebujesz bazy danych, aby pobrać jakieś rzeczy potrzebne do walidacji, to obiekt Database wstrzykujesz jako zależność - patrz Dependency Injection.

2. Łączysz walidację z prezentacją błędów - patrz punk 1. Metody walidujące powinny zwracać void, a w przypadku niepowodzenia rzucać odpowiedni wyjątek, który przechwytujesz i obsługujesz w wartwie powyżej. Aktualne podejście wprowadza jedynie niepotrzebny stan dla Twojej klasy (własność $errors).

3. Bezużyteczny interfejs - dla kogo wystawiasz takie API? Aktualnie nie widzę klienta tej abstrakcji ;)

4. Kod nie jest zgodny z PSR: złe formatowanie instrukcji warunkowych (nawet kilka klamer Ci zjadło, więc ten kod by nie zadziałał), nieprawidłowe nazewnictwo niektórych metod oraz klas itd.

5. Zbędna własność $fields - nie wykorzystujesz jej nigdzie.

W sama logikę się nie zagłębiałem, są to czysto projektowe uwagi :)

Podobne pytania

0 głosów
1 odpowiedź 265 wizyt
0 głosów
5 odpowiedzi 655 wizyt
pytanie zadane 31 grudnia 2015 w PHP przez McShadow Obywatel (1,050 p.)
0 głosów
0 odpowiedzi 400 wizyt
pytanie zadane 19 grudnia 2022 w PHP przez Mikoh8123 Początkujący (250 p.)

93,377 zapytań

142,379 odpowiedzi

322,528 komentarzy

62,727 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

VMware Cloud PRO - przenieś swoją infrastrukturę IT do chmury
...