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

prosty system logowania/rejestracji oop php

Object Storage Arubacloud
+2 głosów
1,517 wizyt
pytanie zadane 9 grudnia 2017 w PHP przez patrus456 Początkujący (290 p.)
edycja 9 grudnia 2017 przez patrus456

Witam, napisałem prosty system logowania/rejestracji w obiektowym php:

prosty system logowania/rejestracji oop php

I w związku z tym mam do was pytanie, czy idę w dobra stronę, jeśli tak to, co tu poprawić, a jeśli nie to, co robie źle?

komentarz 9 grudnia 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)
Link nie działa.
komentarz 9 grudnia 2017 przez patrus456 Początkujący (290 p.)
Dzięki, już poprawione
1
komentarz 9 grudnia 2017 przez kubaapk Nałogowiec (44,270 p.)
Nazwy metod to jest po prostu dramat. 'nick_password', 'show', 'date', 'email', te nazwy nic nie mówią. Popraw to.

2 odpowiedzi

+4 głosów
odpowiedź 9 grudnia 2017 przez Arkadiusz Waluk Ekspert (287,950 p.)
wybrane 10 grudnia 2017 przez patrus456
 
Najlepsza

To i ja trochę dorzucę:

  • Nieprzestrzeganie standardu PSR-2 (wygląd kodu) w zasadzie w żadnej kwestii. Choć nie jest to oficjalny standard, jest tak popularny, że jego przestrzeganie dla wielu to oczywistość i podstawa.
  • Nazewnictwo: widzę jeden plik "registration" a drugi "zalogowany". To w końcu w jakim języku piszesz i nazywasz? Powinien to być wszędzie angielski.
  • Wszystkie klasy dziedziczące po jednej, która oferuje połączenie do bazy to raczej słaby sposób. Jak w pewnych miejscach by to przeszło, tak np. gdy jedna klasa dodaje użytkownika, waliduje, sprawdza wiek i inne rzeczy, to już za dużo.
  • Wszędzie brak typów przekazywanych argumentów, brak też typów zwracanych. PHP 7 nie jest już nowością, raczej stosowanie tego powinno być normą jeśli tylko jest możliwe.
  • Nawiązywanie połączenia z bazą: gdybym stworzył kilka razy obiekt (albo kilka różnych obiektów dziedziczących po klasie abstrakcyjnej) to połączenie z bazą nawiązałoby się kilkukrotnie, moim zdaniem bez potrzeby.
  • Konfiguracja, np. bazy danych:
    $connect = new mysqli('localhost', 'root', '', 'shop');

    Dane dostępowe wypadałoby gdzieś wyprowadzić, nikt nie szuka danych dostępowych w klasach w środku kodu.

  • Znacznik <font> jest zdeprecjonowany (a więc nie należy go używać, a nadawać style przez CSS):

    echo "<font color=red>".$_SESSION['error']."</font></br>";

    Ponadto nie ma zapisu </br>, jest <br> albo ewentualnie <br/>. Nie widzę też sensu używania cudzysłowów do tekstu, w którym nic nie jest podstawiane (nie zawiera w sobie żadnej zmiennej). Albo zamieniłbym to w taki sposób, aby nie robić konkatenacji z tą zmienną sesyjną, albo zamienił cudzysłowy na apostrofy.

  • Inputy muszą mieć labele.

    <input type="text" name="nick" placeholder="nick"></br>
    
  •   require_once "db_construct.php";

    Takie dołączanie działa, ale nikt już tego nie używa w czasach Compoera i autoloadingu przez PSR-4. Oczywiście jeśli to jest jedna klasa to może i ten Composer nie ma sensu, ale jak dla mnie klas tu powinno być więcej i przy okazji poznałbyś coś, co jest standardem.

  • addslashes() to nie jest zabezpieczenie przed SQL injection, a więc cała ta klasa bez bindowania jest do niczego.
    $nick = addslashes($nick);
    
  • md5() nie nadaje się do hashowania haseł, używamy password_hash() i password_verify().
  • if($this::nick_password($nick, $password)){

    Albo $this-> albo self:: - pierwsze dla zwykłych metod, drugie dla statycznych.

  • //jeśli wszystko w porządku zalogowanie użytkownika

    Takich komentarzy raczej należy się oduczać, po pierwsze są po polsku, po drugie kod powinien być napisany tak, aby dało się to samo z niego zobaczyć.

  • $login->show($_POST['nick'], $_POST['password']);

    A jak ktoś nie prześle tych danych to co? Będą ostrzeżenia, gdyż w tablicy $_POST nie będzie takich elementów. Albo sprawdź czy istnieją i dopiero odczytuj, albo użyj np. filter_input (samo dba o sprawdzenie i odczytanie, do tego można dorzucić jakieś filtry czy walidację).

  • if(strlen($nick) == 0)

    strlen() ma problem z polskimi znakami, użyj mb_strlen().

  • if(!strpos($email, '@') || !strpos($email, '.'))

    Coś kiepska ta walidacja emaila, "@." jest dla Ciebie poprawnym emailem?

  • $date_Y = date('Y')-$date_explode[0];

    Operować na datach znacznie wygodniej jest na klasie DateTime.

  • $what = "'$this->nick', '$this->password', '$this->email', '$this->date', 0";

    A tu można zrobić śliczne SQL injection, np. przy emailu nie ma nawet tego addslashes().

  • W samej bazie złe kodowanie, masz jakieś latin1.

No cóż, sporo do poprawy, w zasadzie napisania od nowa. Plus mogę dać za próbę obiektowości, a nie robienia tego strukturalnie i za Gita/GitHuba. Mam nadzieję, że moja ocena będzie Ci pomocna. Nikt nie wymaga od osoby zaczynającej naukę, aby to wszystko umiała od razu, tak więc mam nadzieję, że podłapiesz odpowiednie tematy i będzie tylko lepiej.

komentarz 9 grudnia 2017 przez jpacanowski VIP (101,940 p.)
edycja 10 grudnia 2017 przez jpacanowski

if(!strpos($email, '@') || !strpos($email, '.'))

if(!filter_var($email, FILTER_VALIDATE_EMAIL)) {
  ...
}

if(strlen($nick) == 0)

if(empty($nick))
1
komentarz 10 grudnia 2017 przez patrus456 Początkujący (290 p.)
edycja 10 grudnia 2017 przez patrus456
Dziękuje za tą opinie, na pewno będzie pomocna. Zabieram się za naukę i pisanie od nowa, mam nadziej że następnym razem będzie lepiej.
+3 głosów
odpowiedź 9 grudnia 2017 przez CzikaCarry Szeryf (75,340 p.)

No to tak: 

  • nazwy metod mało mówią o ich działaniu, użyciu, przeznaczeniu
  • W plikach z klasami powinny być tylko i wyłącznie klasy, nie powinno być żadnego strukturalnego / proceduralnego kodu. Od tego jest index.php i inne podstrony.
  • Dlaczego odwokujesz się do niestatycznej metody poprzez "::", w dodatku przy użyciu $this? Jeśli chcesz odwołać się do klasy, nie do obiektu, to używasz self::.

Podobne pytania

0 głosów
1 odpowiedź 312 wizyt
pytanie zadane 25 września 2020 w PHP przez niezalogowany
+2 głosów
1 odpowiedź 608 wizyt
pytanie zadane 22 maja 2017 w PHP przez ŁukaszD. Użytkownik (540 p.)
+1 głos
1 odpowiedź 335 wizyt

92,556 zapytań

141,404 odpowiedzi

319,561 komentarzy

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

...