Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Logowanie w OOP
Forum PHP.pl > Forum > Przedszkole
K4mil94
Witam! Jak widać zaczynam w OOP. Dziś napisałem klasę na logowanie, lecz nie wiem czy będzie ona dobra. Oto kod:
  1. <?php
  2. include("include/connect.php");
  3.  
  4. class logowanie {
  5.  
  6.    var $nick;
  7.    var $pass;
  8.    var $sumbit;
  9.    
  10.    function logowanie($nick, $pass, $sumbit) {
  11.    
  12.    $this->nick=$nick;
  13.    $this->pass=$pass;
  14.    $this->sumbit=$sumbit;
  15.    
  16.    }
  17.    
  18.    function authorization() {
  19.    $error=false;
  20.    if(empty($this->nick)) { echo "Pole login puste!";} $error=true;
  21.    if(empty($this->pass)) { echo "Pole haslo puste!";} $error=true;
  22.    if(isset($this->sumbit) && !$error) {
  23.    $zapytanie = "SELECT * FROM user WHERE nick='".$this->nick."';";
  24.    $wynik = mysql_query($zapytanie);
  25.    $dane = mysql_fetch_array($wynik);
  26.        $error2=false;
  27.        if(empty($dane['nick'])) { echo "W bazie nie istnieje taki użytkownik!."} $error2=true;
  28.        if($this->pass != $dane['pass']) { echo "Złe hasło!";} $error2=true;
  29.        if(!$error2) {
  30.        $_SESSION['nick'] = $dane['nick'];
  31.        $_SESSION['id'] = $dane['id'];
  32.        $_SESSION['poziom'] = $dane['poziom'];
  33.        echo "Zalogowano poprawnie! Wróć do strony głównej.";
  34.        }
  35.    }
  36.    else {
  37.    echo "Nie można zalogować! Sprobuj jeszcze raz.";
  38.    }
  39.    }
  40.  
  41. }
  42.  
  43. $zaloguj = new logowanie($_POST['login'], $_POST['haslo'], $_POST['sumbit']);
  44. $zaloguj->authorization();
  45. ?>

Tu mam pytania. Czy jest ona dobra i bezpieczna //Nie dałem żadnego kodowania hasła specjalnie smile.gif ? I czy takie coś zadziała smile.gif
kajzur
Czy zadziała to Ty nam powiedz smile.gif ogólnie przed funkcją, tzn metodą tejże klasy powinien być specyfikator dostępu (wiesz, public, private albo protected). W sumie jeśli tworzysz zmienne sesyjne, wypadało by sesję rozpocząć ;> Warto by było przepuscić login prze jakąś funkcję, typu htmlspecialchars ;> Jeśli nie masz zamiaru zmieniać typu bazy danych, to pójdzie na tym winksmiley.jpg
Spawnm
po co tak:
  1. <?php
  2. function logowanie($nick, $pass, $sumbit) {
  3.  
  4.   $this->nick=$nick;
  5.   $this->pass=$pass;
  6.   $this->sumbit=$sumbit;
  7.  
  8.   }
  9. $zaloguj = new logowanie($_POST['login'], $_POST['haslo'], $_POST['sumbit']);
  10. ?>

nie lepiej :

  1. <?php
  2. public function __construct() {
  3.  
  4.   $this->nick=$_POST['login'];
  5.   $this->pass=$_POST['haslo'];
  6.   $this->sumbit=$_POST['sumbit'];
  7.  
  8.   }
  9. ?>

i bez wywołania smile.gif
K4mil94
Jeśli chodzi o public, privat itd to pisałem to pod PHP 4.

@Spawnm można i tak ;]. Wiesz początkuje ;]
Spawnm
czemu piszesz w php4 blinksmiley.gif
K4mil94
Takie mam zainstalowane apache tongue.gif Jak chce to wystarczy zmienić na public lub private. PS. czy jak dam private i będę używał w funkcji np. $this->nick i wyświetlę funkcje $zaloguj->authorization(); będzie działać ?
Spawnm
private nie możesz wywołać poza klasą , jednak możesz wywołać funkcję publiczną która operuje na czymś prywatnym.
K4mil94
Czyli np.
  1. <?php
  2. class jakasklasa {
  3. private $imie;
  4. private $nazwisko;
  5. public function konstruktor($imie, $nazwisko) {
  6. $this->imie=$imie;
  7. $this->nazwisko=$nazwisko;
  8. }
  9. public function jakasfunkcja() {
  10. echo '$this->imie'. .'$this->nazwisko';
  11. }
  12. }
  13. $objekt = new jakasklasa;
  14. $objekt->jakasfunkcja();
  15. ?>
Spawnm
  1. <?php
  2. konstruktor($imie, $nazwisko) {
  3. ?>

to się nie wywoła , dodatkowo nie pobiera zmiennych ...

__construct się samo wywoła , zajrzyj do manuala smile.gif
K4mil94
Czyli w php 5 zamiast nazwy klasy w konstruktorze ma być __construct ? Wiem że się nie wywoła ;] Nie określiłem ich przy tworzeniu obiektu.
.radex
Cytat(K4mil94 @ 3.04.2009, 21:35:26 ) *
Czyli w php 5 zamiast nazwy klasy w konstruktorze ma być __construct ?


dokładnie. po prostu daj funkcję __construct, a ona sama się odpali

Tylko mała uwaga co do dziedziczenia - jeśli masz klasy X i Y, gdzie X dziedziczy po Y, to w konstruktorze klasy X samemu musisz odpalić konstruktor klasy Y.
pejott
Ey, Panowie, zwracacie mu uwagę na błędy w składni, a nikt mu nie powie, że tak klasa ma mało co wspólnego z OOP?
Obiekt powinien reprezentować coś rzeczywistego, na przykład użytkownika.
I zdecydowanie przejdź na nazewnictwo angielskie.
Spawnm
to czepiając się dalej :
  1. <?php
  2. if(empty($this->nick)) { echo "Pole login puste!";} $error=true;
  3.   if(empty($this->pass)) { echo "Pole haslo puste!";} $error=true;
  4. ?>

$error powinien być w {} smile.gif
K4mil94
Działa mi bez ;P
@pejott czyli jak to powinno wyglądać ?
Crozin
Co do tego jak to ma wyglądać to nie ma jakiś sztywno określonych reguł.

Ale od początku: to co Ty napisałeś nie ma nic wspólnego z OOP (co zauważył już pejoot). Ty napisałeś sobie funkcję (w dodatku "słabą") i otoczyłeś to tylko class'em.

1) W sumie to jedna z ważniejszych rzeczy (choć na pozór na taką nie wygląda). Przejdź na angielski. Ułatwisz i sobie i innym życie.
2) Logowanie nie jest obiektem. Proces logowania to pewna czynność, którą wykonujesz na jakimś obiekcie. Tutaj tym obiektem powinien być użytkownik. Zauważ że logowanie jedynie lekko modyfikuje obiekt użytkownika. Z takiego który jest niezidentyfikowany (gość) na określonego (konkretny użytkownik).
3) Jedna klasa, jedno zadanie. Twoja robi teraz przynajmniej trzy. Weryfikuje dane, przetwarza dane w bazie danych, operuje na użytkowniku.

Przykładowo mógłbyś to zrobić tak: (pseudokod)
  1. <?php
  2.  
  3. //$uzytkownik to jakiś obiekt reprezentujący uzytkownika (nie)zalogowanego
  4.  
  5. //ten kod wykonywany jest po wyslaniu formularza
  6.  
  7. jezeli(formularz_jest_wyslany){
  8.   //$formLog to obiekt, ktory moze reprezentowac formularz logowania (jego pola) uzytkownika
  9.   jezeli($formLog->daneSaPoprawne($_POST....){
  10.      $uzytkownik->zalogowany(true)
  11.   }
  12. }
  13. ?>


Sprawdzanie poprawnosci przeslanych danych (chodzi o sam fakt wypelnienia wszystkich pol poprawnymi wzorcami) może odbywać się w obiekcie formularza. Natomiast sprawdzanie czy użytkownik istnieje/czy ma rzeczywiście takie hasło IMO lepiej jest przenieść do osobnego walidatora.

@Spawnm: apropo http://forum.php.pl/index.php?showtopic=11...mp;#entry592756 Akurat sposób jaki zaprezentował autor jest IMO lepszy. Uniezależnia obiekt od źródła pochodzenia danych.
K4mil94
Rozumiem ten kod tak że mam klasę formLog, która ma w sobie formularz, weryfikacje itd. Potem tylko użycie tych funkcji które się w niej znajdują i tyle ?
pejott
Cytat(Spawnm @ 3.04.2009, 21:03:32 ) *
po co tak:
  1. <?php
  2. function logowanie($nick, $pass, $sumbit) {
  3.  
  4.   $this->nick=$nick;
  5.   $this->pass=$pass;
  6.   $this->sumbit=$sumbit;
  7.  
  8.   }
  9. $zaloguj = new logowanie($_POST['login'], $_POST['haslo'], $_POST['sumbit']);
  10. ?>

nie lepiej :

  1. <?php
  2. public function __construct() {
  3.  
  4.   $this->nick=$_POST['login'];
  5.   $this->pass=$_POST['haslo'];
  6.   $this->sumbit=$_POST['sumbit'];
  7.  
  8.   }
  9. ?>

i bez wywołania smile.gif


No i tu właśnie rezygnujesz z elastyczności jaką daje OOP, bo narzucasz z góry, że dane będą wysłane formularzem.
A może kiedyś będziesz potrzebował zalogować się inną drogą ?
Spawnm
patrząc że funkcja nazywa się logowanie zakładam że inna droga == $_GET

jakoś wątpię aby ktoś chciał wysyłać hasło getem...
już prędzej jego kod był by lepszy bo można by wysyłać $_POST o różnych nazwach pass || password itp...
pejott
No to kiedyś się zdziwisz, GET był akurat słabym przykładem, ale coś bardziej realnego.

Chcesz stworzyć odnośnik, który po kliknięciu automatycznie Cię zaloguje, czasami można takie spotkać po rejestracji.
Co wtedy ?

Musisz myśleć abstrakcyjnie, a nie ograniczać się tylko do bieżących zapotrzebowań.
K4mil94
Koledzy! Napisałem rejestracje w OOP smile.gif Wszystko działa, więc proszę o ocenę smile.gif
Oto kod:
  1. <?php
  2. header("Content-Type: text/html; charset=utf-8");
  3. include("config.php");
  4. class register {
  5.    private $nick;
  6.    private $pass;
  7.    private $email;
  8.    private $name;
  9.    private $city;
  10.    private $age;
  11.    private $gg;
  12.    
  13.    public function __construct($nick, $pass, $email, $name, $city, $age, $gg) {
  14.        $this->nick=$nick;
  15.        $this->pass=md5($pass);
  16.        $this->email=$email;
  17.        $this->imie=$name;
  18.        $this->city=$city;
  19.        $this->age=$age;
  20.        $this->gg=$gg;
  21.    }
  22.    
  23.    public function check($nick, $pass, $email, $name) {
  24.    $error=false;
  25.        if(empty($this->nick)||empty($this->pass)||empty($this->email)||empty($this->name)) {
  26.            echo "Nie wypełniłeś obowiązkowych pól!<br />"; $error=true;
  27.        }
  28.    }
  29.    
  30.    public function form() {
  31.        echo "
  32.        <form method=post>
  33.        Nick: <br />
  34.        <input type=text name=nick /><br />
  35.        Hasło: <br />
  36.        <input type=password name=pass /><br />
  37.        E-mail: <br />
  38.        <input type=text name=email /><br />
  39.        Imię: <br />
  40.        <input type=text name=name /><br />
  41.        Miejscowość: <br />
  42.        <input type=text name=city /><br />
  43.        Rok urodzenia: <br />
  44.        <input type=text name=age /><br />
  45.        Gadu-Gadu: <br />
  46.        <input type=text name=gg /><br />
  47.        <input type=submit name=submit value=Rejestruj /><br />
  48.        ";
  49.    }
  50.    
  51.    public function addMysql() {
  52.        if(isset($_POST['submit'])) {
  53.            $this->check($_POST['nick'], $_POST['pass'], $_POST['email'], $_POST['name']);
  54.            if($error) {
  55.                echo "Nie można zarejestrować!<br />";
  56.            } else {
  57.            $age = date("Y");
  58.            $ageresult = $age-$this->age;
  59.                $query = "INSERT INTO `users`(`id`, `nick`, `pass`, `email`, `name`, `city`, `age`, `gg`) VALUES ('', '$this->nick', '$this->pass', '$this->email', '$this->name', '$this->city', '$ageresult', '$this->gg');";
  60.                $result = mysql_query($query);
  61.                @mail('$this->email', 'Rejestracja', 'Witaj $this->nick!\n Dziękujemy za rejestracje na naszej stronie.');
  62.                
  63.            }
  64.        } else {
  65.            $this->form();
  66.        }
  67.    }
  68. }
  69. $registered = new register($_POST['nick'], $_POST['pass'], $_POST['email'], $_POST['name'], $_POST['city'], $_POST['age'], $_POST['gg']);
  70. $registered->addMysql();
  71. ?>
PS. Wesołych świąt smile.gif
Spawnm
w klasach nie daje się echo,
$error=true; <- to ci nic nie da , istnieje tylko w funkcji sprawdzającej .
ogólnie to to jest klasa tylko z nazwy .
K4mil94
zamiast echo dać return ?
Spawnm
tak
K4mil94
A jak inaczej zrobić zamiast $error ?
Spawnm
po prostu dajesz return false
czyli
  1. <?php
  2. if($this->check(***)){//true
  3.  
  4. }else{//false
  5.  
  6. }
  7. ?>
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.