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

Klasa obsługująca konto - czy dobrze kombinuje

Object Storage Arubacloud
+1 głos
470 wizyt
pytanie zadane 3 grudnia 2018 w PHP przez marcolo Obywatel (1,530 p.)
edycja 3 grudnia 2018 przez marcolo

To moja pierwsza próba obiektowego rozwiązania rejestracji i logowania.

Chciałbym się dowiedzieć, czy działam dobrze, czy robi się to kompletnie inaczej?

if(!isset($_SESSION['zalogowano'])) {
        echo '<form method="post" action="login.php">';
            echo '<input type="text" name="login" placeholder="Login">';
            echo '<input type="password" name="pass" placeholder="Hasło">';
            echo '<input type="submit" name="zaloguj" value="Zaloguj">';
        echo '</form>';
        
        if(isset($_SESSION['l_error'])) {
            echo '<pre>';
            print_r($_SESSION['l_error']);
            echo '</pre>';
        }

        echo '<br>';
        echo '<a href="index.php?zar=true">Zarejestruj</a>';
        echo '<br>';

        if(isset($_GET['zar'])) {
            echo '<form method="post" action="rejestracja.php">';
                echo '<input type="text" name="login" placeholder="Login">';
                echo '<input type="password" name="pass" placeholder="Hasło">';
                echo '<input type="password" name="pass2" placeholder="Powtórz hasło">';
                echo '<input type="email" name="email" placeholder="E-mail">';
                echo '<input type="submit" name="zarejestruj" value="Zarejestruj">';
            echo '</form>';
        }
        
        if(isset($_SESSION['r_error'])) {
            echo '<pre>';
            print_r($_SESSION['r_error']);
            echo '</pre>';
        }
    }

plik login.php

session_start();

if(isset($_POST['zaloguj'])) {
    require_once 'account.class.php';
    
    $user = new Account;
    $user->login($_POST['login'], $_POST['pass']);
    
    header("Location: index.php");
}

i rejestracja.php

session_start();

if(isset($_POST['zarejestruj'])) {
    require_once 'account.class.php';
    require_once 'database.php';
    
    $user = new Account;
    $user->db($db);
    $user->register($_POST['login'], $_POST['pass'], $_POST['pass2'], $_POST['email']);
    
    header("Location: index.php");
}

no i sama klasa

class Account {
    private $login, $haslo, $haslo2, $email, $kod, $data, $db, $noerror = true;
    
    public function db($db) {
        $this->db = $db;
    }
    
    public function hashPass($pass) {
        $this->haslo = password_hash($pass, PASSWORD_DEFAULT);
        echo $this->haslo;
    }
    
    private function checkLoginDate() {
        if(empty($this->login)) {
            $this->noerror = false;
            $_SESSION['l_error'][1] = 'Proszę podać login';
        } else {
            unset($_SESSION['l_error'][1]);
        }
        
        if(empty($this->haslo)) {
            $this->noerror = false;
            $_SESSION['l_error'][2] = 'Proszę podać hasło';
        } else {
            unset($_SESSION['l_error'][2]);
        }
    }
    
    private function isLogged() {
    }

    public function login($login, $haslo) {
        $this->login = $login;
        $this->haslo = $haslo;
        $this->checkLoginDate();
        if($this->noerror===true) {
            $this->isLogged();
            unset($_SESSION['l_error']);
        }
    }
    
    private function checkRegisterDate() {
        if(empty($this->login)) {
            $this->noerror = false;
            $_SESSION['r_error'][1] = 'Proszę podać login';
        } else {
            unset($_SESSION['r_error'][1]);
        }
        
        if(empty($this->email)) {
            $this->noerror = false;
            $_SESSION['r_error'][2] = 'Proszę podać e-mail';
        } else {
            unset($_SESSION['r_error'][2]);
        }
        
        if(empty($this->haslo)) {
            $this->noerror = false;
            $_SESSION['r_error'][3] = 'Proszę podać hasło';
        } else {
            unset($_SESSION['r_error'][3]);
        }
        
        if(empty($this->haslo2)) {
            $this->noerror = false;
            $_SESSION['r_error'][4] = 'Proszę powtórzyć hasło';
        } else {
            unset($_SESSION['r_error'][4]);
        }
        
        if($this->haslo !== $this->haslo2) {
            $this->noerror = false;
            $_SESSION['r_error'][5] = 'Hasła muszą być takie same';
        } else {
            unset($_SESSION['r_error'][5]);
        }
    }
    
    private function createCode() {
        $zakres = '1234567890qwertyuiopasdfghjklzxcvbnm';
        $this->kod = '';
        for ($i=0; $i<7; $i++)
        {
            $this->kod .= $zakres[mt_rand ()%(strlen($zakres))];
        }
    }
    
    private function addUser() {
        $this->db->query("INSERT INTO users (login, haslo, email, kod, data, aktywacja, uprawnienia) VALUES ('$this->login', '$this->haslo', '$this->email', '$this->kod', '$this->data', 1, 3)");
    }
    
    public function register($login, $haslo, $haslo2, $email) {
        $this->login = $login;
        $this->haslo = $haslo;
        $this->haslo2 = $haslo2;
        $this->email = $email;
        $this->data = date('Y.m.d');
        $this->checkRegisterDate();
        if($this->noerror===true) {
            $this->hashPass($this->haslo);
            $this->createCode();
            $this->addUser();
            unset($_SESSION['r_error']);
        }
    }
}

Zaznaczam, że to nie jest skończone, np nie zajmowałem się sprawdzaniem czy istnieje użytkownik, sql injection itd, napisałem to aby zapytać, czy dobrze myślę jak to zrobić, czy mam złe podejście, i robi się to zupełnie inaczej?

1 odpowiedź

+2 głosów
odpowiedź 5 grudnia 2018 przez CenterPL Pasjonat (19,070 p.)
Jeżeli już pytasz czy robisz to dobrze, to odpowiedź brzmi - robisz to źle.

1. Mieszasz angielski z polskim

2. Twoja klasa zajmuje się wieloma rzeczami: Odpytuje bazę danych, tworzy password hash, waliduje dane itd

3. require_once 'account.class.php'; <- tak się robiło 10 lat temu.

4. pliki login czy register, to również powinny być klasy.

I tak dalej.

To co mogę Ci poradzić, to jeżeli już coś ogarniasz, zapoznaj się ze wzorcem Front Controller a potem z MVC i zacznij pisać bliższe nowoczesności projekciki. Dołóż jeszcze composera i będzie git. To co teraz zrobiłeś, to echo przeszłości.
komentarz 5 grudnia 2018 przez marcolo Obywatel (1,530 p.)
Dzięki za wskazówki.

Podobne pytania

+1 głos
1 odpowiedź 201 wizyt
+1 głos
2 odpowiedzi 322 wizyt
pytanie zadane 10 czerwca 2015 w PHP przez makoso Mądrala (7,380 p.)
–1 głos
1 odpowiedź 107 wizyt
pytanie zadane 23 lipca 2020 w PHP przez _Pita_ Stary wyjadacz (11,410 p.)

92,551 zapytań

141,393 odpowiedzi

319,523 komentarzy

61,936 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!

...