Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP5][OOP] Problem ze skryptem
Forum PHP.pl > Forum > Przedszkole
qba10
Witam

Na podstawie http://www.strefaphp.net/artykul36.html chciałem napisać ten skrypt w OOP, ale chyba coś nie wyszło....
Tu moja prośba by sprawdzić mój skrypt, czy ma identyczne działanie jak ten z linku...

Oto skrypt (połączenie z bazą danych jest wykonywane przed wykonaniem tego obiektu):
  1. <?php
  2. class logowanie
  3.  {
  4. public $login;
  5. public $haslo;
  6. public $zapamietaj; 
  7. public $login_use;
  8. public $haslo_use;
  9. public $zalogowany;
  10. public $metod;
  11. public $dane;
  12. public $kxc = "a523d703f908dd69e02db64ec35d07315f4c49ab3cacad14a97304b02f2fbb09";  
  13.  
  14.  
  15.  
  16.  private function sprawdzanie()
  17.  {
  18.  
  19. if(isset($_COOKIE['dane'])) 
  20. {
  21. $this->dane = $_COOKIE["dane"]^$this->kxc;
  22. $this->login_use = substr($dane, 0, 32);
  23. $this->haslo_use = substr($dane, -32);
  24. $this->metod = "cookies";
  25. }
  26. elseif(isset($_SESSION['login']) AND isset($_SESSION['haslo'])) 
  27. {
  28. $this->login_use = $_SESSION['login'];
  29. $this->haslo_use = $_SESSION['haslo'];
  30. $this->metod = "session";
  31. }
  32. elseif(isset($this->login) AND isset($this->haslo)) 
  33. {
  34. $this->login_use = md5(strtolower($this->login));
  35. $this->haslo_use = md5($this->haslo);
  36. $this->metod = "post";
  37. } 
  38.  
  39.  
  40.  
  41.  }
  42.  public function autoryzacja($login, $haslo, $zapamietaj )
  43. {
  44.  
  45.  $this->login = $login ;
  46.  $this->haslo = $haslo;
  47.  $this->zapamietaj = $zapamietaj;
  48.  
  49.  
  50.  $this->zalogowany = false ;
  51.  if(isset($this->metod)) 
  52.  {
  53.  $query = mysql_query("SELECT * FROM `users` WHERE `user`='".$this->login_use."' AND `pass`='".$this->haslo_use."';"); 
  54.  if(mysql_num_rows($query) == 1) 
  55.  {
  56.  
  57.  $wiersz = mysql_fetch_array($query);
  58.  $_SESSION['login'] = $wiersz['user'];
  59.  $_SESSION['haslo'] = $wiersz['pass'];
  60.  $_SESSION['nick'] = $wiersz['nick']; 
  61.  $this->zalogowany = true;
  62.  if($this->metod == "post" AND isset( $this->zapamietaj) AND $this->zapamietaj == "ok") 
  63.  {
  64.  $dane = ($login.$haslo)^$_CONFIG['kxc'];
  65.  setcookie ("dane", $dane,time()+3600*24*365);
  66.  }
  67.  
  68. return $this->zalogowany ;  
  69.  }
  70.  }
  71.  
  72. }
  73. }
  74. ?>


PS: Żadnego błędu mi nie wywala ale, logowanie nie chce działać...

Pozdrawiam
Qba10
Maciekbjw
Może opisz co dokładnie się dzieje...

A wysyłasz jakieś dane w ogóle ?tongue.gif
qba10
No się loguję za pomocą formularza no i metoda autoryzacja() zwraca mi false mimo że takie dane mam w mysql i z tym skryptem napisanym strukturalnie all było git, ale teraz uczę się OOP i chciałem go napisać obiektowo.

PS: Znacie jakiś dobry kurs OOP ale w PHP5, bo w google żadnego porządnego nie mogą znaleść a ten na wortalu jakoś mi nie podchodzi....
nithajasz
Ja się tak zapytam, masz dwie metody, sprawdzanie i autoryzacja. Gdzie one są ze sobą powiązane? W skrypcie gdzieś dalej? Po drugie jeśli najpierw sprawdzasz dane, metodą sprawdzanie to ona powinna coś zwracać bo inaczej nie przekażesz żadnych danych do autoryzacji.

Przynajmniej moim zdaniem nie znam kursu może coś innego tam wymodzili.
qba10
Ale przecież metoda sprawdzenie() przekazuje do właściwości klasy $metod odpowiednią wartość. I wtedy metoda autoryzacja() wczytuje wartość $metod. Czy takie coś jest błędem?
nithajasz
Gdzie przekazuje? Bo jeśli w klasie to albo jestem ślepy albo tego nie widzę tongue.gif

Edit: Spojrzałem na ten tutek co podałeś. Tam masz zupełnie coś innego niż chcesz a praktycznie przepisujesz kod. Tam masz jedną funkcję w której masz to wszystko, co ty podzieliłeś na dwie metody. Jeśli chcesz by to działało to zwracaj coś z metody sprawdzanie, ten login, hasło i co tam masz i wywołuj metodę autoryzacja z tymi danymi.

Bo tak to trudno by zwróciła Ci coś innego jeśli nie podajesz jej żadnych danych do sprawdzenia, zawsze zwróci FALSE.

Przykład taki najprostszy:

  1. <?php
  2. class prosta_klasa{
  3.  
  4. public $zalogowany = 0;
  5.  
  6. public function __construct($login, $password)
  7. {
  8. if($this -> sprawdz($login, $password)) $this -> loguj();
  9.  
  10. }
  11.  
  12. public function loguj()
  13. {
  14.  // ustawiasz parametr, który świadczy o zalogowaniu uzytkownika
  15. $this -> zalogowany = 1;
  16. // lub 
  17. $_SESSION['logged'] = 1;
  18. }
  19.  
  20. public function sprawdz($login, $password)
  21. {
  22. // tu sprawdzasz co tam chcesz np. walidujesz zmienne, sprawdzasz czy uzytkownik i
    stnieje w bazie
  23. // jesli dane sie zgadzaja to 
  24. return TRUE;
  25. // jesli nie to
  26. return FALSE;
  27. }
  28.  
  29. }
  30. ?>


Wtedy dane z formularza przekazujesz jako parametr przy tworzeniu obiektu klasy

  1. <?php
  2. $user = new prosta_klasa($login, $password);
  3. ?>


Jakoś tak, pisane tak z palca więc nie gwarantuje, że dobrze. Chodzi o ogólną zasadę tego.

Jeszcze raz w funkcji którą przerabiasz te dane są przekazywane po przez utworzenie zmiennej. W metodach te dane musisz zwrócić i przekazać do innej metody. Tak jakbyś chciał użyć tej samej zmiennej w dwóch różnych funkcjach.
qba10
No to wymodziłem coś takiego:
  1. <?php
  2. class logowanie{
  3.  
  4.  
  5. private $kxc = "a523d703f908dd69e02db64ec35d07315f4c49ab3cacad14a97304b02f2fbb09"; 
  6.  
  7.  
  8.  
  9. public function autoryzacja($login, $haslo, $zapamietaj)
  10. {
  11. if(isset($_COOKIE['dane'])) 
  12. {
  13. $dane = $_COOKIE["dane"]^$this->kxc;
  14. $login_use = substr($dane, 0, 32);
  15. $haslo_use = substr($dane, -32);
  16. $metod = "cookies";
  17. }
  18. elseif(isset($_SESSION['login']) AND isset($_SESSION['haslo'])) 
  19. {
  20. $login_use = $_SESSION['login'];
  21. $haslo_use = $_SESSION['haslo'];
  22. $metod = "session";
  23. }
  24. elseif(isset($login) AND isset($haslo)) 
  25. {
  26. $login_use = md5(strtolower($login));
  27. $haslo_use = md5($haslo);
  28. $metod = "post";
  29. } 
  30. if(isset($this->metod)) 
  31. {
  32.  $query = mysql_query("SELECT * FROM `users` WHERE `user`='".$login_use."' AND `pass`='".$haslo_use."';"); 
  33.  if(mysql_num_rows($query) == 1) 
  34.  {
  35.  
  36.  $wiersz = mysql_fetch_array($query);
  37.  $_SESSION['login'] = $wiersz['user'];
  38.  $_SESSION['haslo'] = $wiersz['pass'];
  39.  $_SESSION['nick'] = $wiersz['nick']; 
  40.  
  41.  if($metod == "post" AND isset( $zapamietaj) AND $zapamietaj == "ok") 
  42.  {
  43.  $dane = ($login.$haslo)^$_CONFIG['kxc'];
  44.  setcookie ("dane", $dane,time()+3600*24*365);
  45.  }
  46.  return TRUE;
  47.  } 
  48.  else
  49.  {
  50.  return FALSE;
  51.  }
  52. }
  53.  
  54. }
  55.  
  56. }
  57. ?>


No i teraz passer wywala mi to:
Kod

   <b>Warning</b>:  Missing argument 1 for logowanie::autoryzacja(), called in /home/qba10/public_html/test/index.php on line 5 and defined in <b>/home/qba10/public_html/test/system/jadro/e-door/functions/logowanie.php</b> on line <b>9</b>
  
   <b>Warning</b>:  Missing argument 2 for logowanie::autoryzacja(), called in /home/qba10/public_html/test/index.php on line 5 and defined in <b>/home/qba10/public_html/test/system/jadro/e-door/functions/logowanie.php</b> on line <b>9</b>
  
   <b>Warning</b>:  Missing argument 3 for logowanie::autoryzacja(), called in /home/qba10/public_html/test/index.php on line 5 and defined in <b>/home/qba10/public_html/test/system/jadro/e-door/functions/logowanie.php</b> on line <b>9
</b>


Co napisałem źle questionmark.gif
erix
A jak wywołujesz tą metodę autoryzacja?
qba10
  1. <?php
  2. $logowanie = new logowanie ;
  3. $logowanie->autoryzacja($_POST['user'],$_POST['haslo'], $_POST['zapamietaj']);
  4. ?>
erix
A zrób przed tym var_dump($_POST) i zobacz, czy na pewno są jakieś dane w $_POST.
nithajasz
Parser dokładnie Ci powiedział co jest nie tak. Brakuje Ci danych przekazywanych do tej autoryzacji, więc pewnie wywołujesz ją w momencie gdy tablice $_POST masz pustą, np. przed wysłaniem formularza..

Zrób sobie coś na podobieństwo tego:

  1. <?php
  2. if(isset($_POST[&apos;form_check&apos;]){
  3. //utowrzenie obiektu klasy i wywołanie autoryzacji
  4. } else {
  5. //wyswietlenie formularza i dodaj w nim pole :
  6. // 
  7. }
  8. ?>


To powinno w jakiś sposób pomóc jak zrozumiesz o co chodzi.

Po drugie nie bardzo rozumiesz zasadę obiektowego programowania. Poszukaj na google.pl haseł "programowanie obiektowe php5" parę pozycji jest, z którymi warto się zapoznać na początek.

Dobrym źródłem jest też PHPEdia.. prosto opisane co i jak. Może nie wyszystko ale podstawy tam są.
http://www.phpedia.pl/wiki/Klasa

Lub wikibooks : http://pl.wikibooks.org/wiki/PHP/Klasy_i_obiekty
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.