Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

2 Stron V   1 2 >  
Reply to this topicStart new topic
> [PHP]Logowanie w OOP
K4mil94
post 3.04.2009, 19:09:08
Post #1





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


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

Ten post edytował K4mil94 3.04.2009, 19:10:13
Go to the top of the page
+Quote Post
kajzur
post 3.04.2009, 20:00:13
Post #2





Grupa: Zarejestrowani
Postów: 385
Pomógł: 26
Dołączył: 22.03.2008
Skąd: TM

Ostrzeżenie: (0%)
-----


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


--------------------
Zapraszam na mojego bloga. Dowiedz się jak uzyskać darmowy, zaufany certyfikat albo jak rozpoznawać głos ;)
Go to the top of the page
+Quote Post
Spawnm
post 3.04.2009, 20:03:32
Post #3





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




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
Go to the top of the page
+Quote Post
K4mil94
post 3.04.2009, 20:05:56
Post #4





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


Jeśli chodzi o public, privat itd to pisałem to pod PHP 4.

@Spawnm można i tak ;]. Wiesz początkuje ;]

Ten post edytował K4mil94 3.04.2009, 20:08:19
Go to the top of the page
+Quote Post
Spawnm
post 3.04.2009, 20:08:11
Post #5





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




czemu piszesz w php4 blinksmiley.gif
Go to the top of the page
+Quote Post
K4mil94
post 3.04.2009, 20:10:57
Post #6





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


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ć ?
Go to the top of the page
+Quote Post
Spawnm
post 3.04.2009, 20:14:30
Post #7





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




private nie możesz wywołać poza klasą , jednak możesz wywołać funkcję publiczną która operuje na czymś prywatnym.
Go to the top of the page
+Quote Post
K4mil94
post 3.04.2009, 20:21:05
Post #8





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


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. ?>
Go to the top of the page
+Quote Post
Spawnm
post 3.04.2009, 20:25:08
Post #9





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




  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
Go to the top of the page
+Quote Post
K4mil94
post 3.04.2009, 20:35:26
Post #10





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
.radex
post 3.04.2009, 20:37:50
Post #11





Grupa: Zarejestrowani
Postów: 1 657
Pomógł: 125
Dołączył: 29.04.2006

Ostrzeżenie: (0%)
-----


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.

Ten post edytował .radex 3.04.2009, 20:39:13


--------------------
blog | Tadam — minutnik do Pomodoro na Maka :)
Go to the top of the page
+Quote Post
pejott
post 5.04.2009, 11:50:09
Post #12





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Spawnm
post 5.04.2009, 11:53:40
Post #13





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




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
Go to the top of the page
+Quote Post
K4mil94
post 5.04.2009, 11:57:26
Post #14





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


Działa mi bez ;P
@pejott czyli jak to powinno wyglądać ?

Ten post edytował K4mil94 5.04.2009, 11:57:53
Go to the top of the page
+Quote Post
Crozin
post 5.04.2009, 15:15:15
Post #15





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
K4mil94
post 5.04.2009, 17:03:42
Post #16





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


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 ?
Go to the top of the page
+Quote Post
pejott
post 6.04.2009, 15:01:01
Post #17





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

Ostrzeżenie: (0%)
-----


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ą ?
Go to the top of the page
+Quote Post
Spawnm
post 6.04.2009, 15:05:48
Post #18





Grupa: Moderatorzy
Postów: 4 069
Pomógł: 497
Dołączył: 11.05.2007
Skąd: Warszawa




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...
Go to the top of the page
+Quote Post
pejott
post 6.04.2009, 15:22:42
Post #19





Grupa: Zarejestrowani
Postów: 81
Pomógł: 4
Dołączył: 15.02.2009

Ostrzeżenie: (0%)
-----


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ń.
Go to the top of the page
+Quote Post
K4mil94
post 11.04.2009, 09:59:07
Post #20





Grupa: Zarejestrowani
Postów: 302
Pomógł: 18
Dołączył: 10.03.2008
Skąd: Dębno

Ostrzeżenie: (0%)
-----


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

Ten post edytował K4mil94 11.04.2009, 10:00:35
Go to the top of the page
+Quote Post

2 Stron V   1 2 >
Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Wersja Lo-Fi Aktualny czas: 15.08.2025 - 03:42