Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Logowanie w php
Forum PHP.pl > Forum > Przedszkole
pawelit
  1. <?php
  2.  
  3. class Logowanie {
  4. private $user;
  5. private $password;
  6. private $errors;
  7.  
  8. public function __construct() {
  9. $this->user = $this->filter($_POST['user']);
  10. $this->password = md5($this->filter($_POST['pass']));
  11. $this->errors = array();
  12. }
  13.  
  14. public function filter($var){
  15. return preg_replace('/[^a-zA-Z0-9@.]/','',$var);
  16. }
  17.  
  18.  
  19. public function validate(){
  20.  
  21. if(empty($this->user))
  22. $this->errors[] = 'Podaj poprawna nazwe uzytkownika';
  23. if(empty($this->password))
  24. $this->errors[] = 'Podaj poprawne haslo';
  25.  
  26. return count($this->errors)? 0 : 1;
  27.  
  28. }
  29.  
  30. public function process(){
  31. if($this->validate())
  32.  
  33. if (login() == $this->password){
  34. $_SESSION['permissions'] = 1;
  35. echo "Zalogowano";
  36. }
  37.  
  38. else { echo "kura";}
  39.  
  40. return count($this->errors)? 0 : 1;
  41. }
  42.  
  43.  
  44. public function show_errors()
  45. {
  46. echo "<h3>Errors</h3>";
  47.  
  48. foreach($this->errors as $key=>$value)
  49. echo $value."<br>";
  50. }
  51.  
  52. public function login(){
  53. try
  54.  
  55. {
  56. $pdo = new PDO('mysql:host=localhost;dbname=kom', 'root', '');
  57. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  58.  
  59. $stmt = $pdo -> query("SELECT password FROM users WHERE user = '{$this->user}'");
  60. $stmt -> closeCursor();
  61. }
  62.  
  63. catch(PDOException $e)
  64.  
  65. {
  66. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  67. }
  68. return $stmt;
  69. }
  70. ?>



  1. <html>
  2. <head>
  3. <title>
  4. logowanie
  5. </title>
  6. </head>
  7. <body>
  8.  
  9.  
  10.  
  11. <?php
  12. if (isset ($_POST['login']))
  13. {
  14. include_once '/logowanie.php';
  15. $a = new Logowanie();
  16. if($a->process())
  17. echo "Login!";
  18. else
  19. $a->show_errors();
  20.  
  21. }
  22.  
  23. ?>
  24.  
  25.  
  26.  
  27. <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>">
  28. <table>
  29. <tr><td>User:</td><td><input type="text" name="user"/></td></tr>
  30. <tr><td>Password:</td><td><input type="password" name="pass"/></td></tr>
  31. </table>
  32.  
  33. <input type="submit" name="login" value="Log in"/>
  34. </form>
  35.  
  36.  
  37. </body>
  38. </html>



Niestety nie loguje. Czy taka konstrukcja jest prawidłowa:
  1. if (login() == $this->password){
  2. $_SESSION['permissions'] = 1;
  3. echo "Zalogowano";
  4. }
?
!*!
W końcu ktoś kto napisał klasę logowania w php5 i jeszcze użył PDO, normalnie jestem pod wrażeniem smile.gif

Konstrukcja nie jest prawidłowa bo metoda login() nie jest statyczna, poza tym chcesz porównać login do hasła, no i nie wysyłasz go forumlarzem? I ciut przekombinowałeś, sprawdzaj tylko czy sesja istnieje.
pawelit
Teoretycznie metoda login() wyciąga hasło usera z bazy danych którego login podam w formularzu.
W 10 linii robię tak
  1. $this->password = md5($this->filter($_POST['pass']));

czyli chcę zhashować podane hasło w formularzu, a w metodzie process porównuję
  1. if (login() == $this->password){
  2. $_SESSION['permissions'] = 1;
  3. echo "Zalogowano";
  4. }


to wyciągnięte (zhashowane przy rejestracji) hasło ze zhashowanym w 10 linii hasłem z formularza. Jeśli są takie same to $_SESSION['permissions'] = 1;
mortus
@!*! A gdyby metoda login() była statyczna, to wspomniany skrypt by działał? Wątpię.

@pawelit To, że metoda login() jest publiczna nie oznacza, że wewnątrz klasy jest dostępna jako login().
  1. if($this->login() == $this->password) {
  2. $_SESSION['permissions'] = 1;
  3. echo "Zalogowano";
  4. }


Uwagi co do klasy:
- nie jestem pewien, czy taka klasa powinna przechowywać dane logowania (po co?),
- warto by było oddzielić walidację od samego procesu logowania.
pawelit
Dzięki za odpowiedzi.

Teraz zrobiłem tak, chyba coś jeszcze źle zrobiłem bo nie wyświetla a wygląda że wszystko ok

  1. <?php session_start();?>
  2. <html>
  3. <head>
  4. <title>
  5. logowanie
  6. </title>
  7. </head>
  8. <body>
  9. <?php
  10. if (isset ($_POST['login']))
  11. {
  12. include_once '/logowanie.php';
  13. $a = new Logowanie();
  14.  
  15. if($a->process())
  16. {
  17. echo "Login!";
  18. }
  19. else {
  20. $a->show_errors();
  21. }
  22.  
  23.  
  24.  
  25. }
  26. if(isset($_SESSION['permissions']) && $_SESSION['permissions'] == 1) {
  27.  
  28. echo "ukryta tresc";
  29. }
  30.  
  31. ?>
  32.  
  33.  
  34.  
  35. <form method="POST" action="<?php echo $_SERVER['PHP_SELF'];?>">
  36. <table>
  37. <tr><td>User:</td><td><input type="text" name="user"/></td></tr>
  38. <tr><td>Password:</td><td><input type="password" name="pass"/></td></tr>
  39. </table>
  40.  
  41. <input type="submit" name="login" value="Log in"/>
  42. </form>
  43.  
  44.  
  45. </body>
  46. </html>


  1. <?php
  2.  
  3. class Logowanie {
  4. private $user;
  5. private $password;
  6. private $errors;
  7.  
  8. public function __construct() {
  9. $this->user = $this->filter($_POST['user']);
  10. $this->password = md5($this->filter($_POST['pass']));
  11. $this->errors = array();
  12. }
  13.  
  14. public function filter($var){
  15. return preg_replace('/[^a-zA-Z0-9@.]/','',$var);
  16. }
  17.  
  18.  
  19. public function validate(){
  20.  
  21. if(empty($this->user))
  22. $this->errors[] = 'Podaj poprawna nazwe uzytkownika';
  23. if(empty($this->password))
  24. $this->errors[] = 'Podaj poprawne haslo';
  25.  
  26. return count($this->errors)? 0 : 1;
  27.  
  28. }
  29.  
  30. public function process(){
  31. if($this->validate()){
  32.  
  33. if($this->login() == $this->password) {
  34. $_SESSION['permissions'] = 1;
  35.  
  36. }
  37.  
  38. }
  39. return count($this->errors)? 0 : 1;
  40. }
  41.  
  42.  
  43.  
  44.  
  45.  
  46.  
  47. public function show_errors()
  48. {
  49. echo "<h3>Errors</h3>";
  50.  
  51. foreach($this->errors as $key=>$value)
  52. echo $value."<br>";
  53. }
  54.  
  55. public function login(){
  56. try
  57.  
  58. {
  59. $pdo = new PDO('mysql:host=localhost;dbname=kom', 'root', '');
  60. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  61.  
  62. $stmt = $pdo -> query("SELECT password FROM users WHERE user = '{$this->user}'");
  63. $stmt -> closeCursor();
  64. }
  65.  
  66. catch(PDOException $e)
  67.  
  68. {
  69. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  70. }
  71. return $stmt;
  72.  
  73.  
  74.  
  75.  
  76.  
  77. }
  78.  
  79. }
  80.  
  81.  
  82.  
  83.  
  84. ?>
  85.  
  86.  
mortus
Czego nie wyświetla? Pojawiają się jakieś błędy? Włącz wyświetlanie i raportowanie wszystkich błędów w głównym pliku.

Takie uwagi mi się jeszcze nasunęły:
- dane do logowania powinny być przekazane, jako argument konstruktora, a nie pobierane w konstruktorze bezpośrednio z $_POST,
- Twoja funkcja filter() jest bez sensu, bo bez wiedzy użytkownika zamienia wpisane przez niego słowo na coś innego, a tymczasem powinna zgłosić błąd, że wprowadzono niedozwolone znaki.

Mam chwilę, to zaraz sprawdzę ten kod dokładniej.
pawelit
  1. if(isset($_SESSION['permissions']) && $_SESSION['permissions'] == 1) {
  2.  
  3. echo "ukryta tresc";
  4. }


Tak jakby $_SESSION['permissions'] nie istaniało

Struktura bazy danych to:


  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` int(32) NOT NULL AUTO_INCREMENT,
  3. `user` varchar(32) NOT NULL,
  4. `password` varchar(32) NOT NULL,
  5. `email` varchar(32) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=12 ;

!*!
mortus - nie, źle się wyżej wyraziłem.

  1. $stmt = $pdo -> query("SELECT password FROM users WHERE user = '{$this->user}'");


Do czego Ci te nawiasy ? I nie jestem przekonany co do poprawności samego zapytania. Użyj też bindowania do PDO (tak na przyszłość, coby zapobiec SQLi)

Poza tym nie musisz sprawdzać czy $_SESSION['permissions'] jest równe 1 (sesja ta w ogóle istnieje w kodzie?)

Oddziel też walidacje od samego procesu logowania.
pawelit
Cytat(!*! @ 14.09.2011, 15:07:33 ) *
mortus - nie, źle się wyżej wyraziłem.

  1. $stmt = $pdo -> query("SELECT password FROM users WHERE user = '{$this->user}'");


Do czego Ci te nawiasy ? I nie jestem przekonany co do poprawności samego zapytania. Użyj też bindowania do PDO (tak na przyszłość, coby zapobiec SQLi)

Poza tym nie musisz sprawdzać czy $_SESSION['permissions'] jest równe 1 (sesja ta w ogóle istnieje w kodzie?)

Oddziel też walidacje od samego procesu logowania.


  1. public function process(){
  2. if($this->validate()){
  3.  
  4. if($this->login() == $this->password) {
  5. $_SESSION['permissions'] = 1;
  6.  
  7. }
  8.  
  9. }
  10. return count($this->errors)? 0 : 1;
  11. }
mortus
Źle używasz PDO, w związku z czym warunek if($this->login() == $this->password) nigdy nie jest spełniony. Funkcja login() powinna wyglądać tak:
  1. public function login(){
  2. try {
  3. $pdo = new PDO('mysql:host=localhost;dbname=kom', 'root', '');
  4. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5. $stmt = $pdo->query("SELECT password FROM users WHERE user = '{$this->user}'");
  6. $row = $stmt->fetch(); // wyciągamy wiersz z otrzymanych wyników zapytania
  7. $stmt->closeCursor();
  8. } catch(PDOException $e) {
  9. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  10. }
  11. return $row['password']; // zwracamy hasło
  12. }


Radzę przemyśleć kwestię równej tabulacji kodu, co dzisiaj załatwia większość edytorów programistycznych.
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.