• 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 ?

Object Storage Arubacloud
0 głosów
104 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ź 241 wizyt
0 głosów
5 odpowiedzi 335 wizyt
pytanie zadane 31 grudnia 2015 w PHP przez McShadow Obywatel (1,050 p.)
0 głosów
0 odpowiedzi 184 wizyt
pytanie zadane 19 grudnia 2022 w PHP przez Mikoh8123 Początkujący (250 p.)

92,584 zapytań

141,434 odpowiedzi

319,671 komentarzy

61,968 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.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...