Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Ocena skryptu logowania
Forum PHP.pl > Inne > Oceny
dyndel
Mam kilka pytań, do rzeczy:
1. Napisałem własną funkcję logowania użytkownika, oto ona:

  1. public function Login($Login, $Haslo)
  2. {
  3. if(isset($_POST['login']))
  4. {
  5. if(!$Login | !$Hasło)
  6. {
  7. echo $this->Error(''.$this->Lang[20].' '.$this->Lang[22].'');
  8. }
  9. else
  10. {
  11. $Query = mysql_fetch_array(mysql_query("SELECT `Login`, `Haslo`, `IP` FROM `users` WHERE `Login` = '".$Login."'"));
  12. $Check = mysql_num_rows(mysql_query("SELECT `Login`, `Haslo` FROM `users` WHERE `Login` = '".$Login."'"));
  13. if($Check == 0)
  14. {
  15. echo $this->Error(''.$this->Lang[20].' '.$this->Lang[23].'');
  16. }
  17. else
  18. {
  19. if(md5($Hasło) == $Query['Haslo'])
  20. {
  21. $IP = ''.$Query['IP'].';\n'.$_SERVER['REMOTE_ADDR'].'';
  22. $Data = date('d.m.Y, H:i:s');
  23. $this->User->Login = $Login;
  24. $this->User->Zalogowany = 1;
  25. $this->User->Time = time();
  26. if(mysql_query("UPDATE `users` SET `LastActivity` = '".$Data."', `Online` = 1, `Czas` = ".time().", `IP` = '".$IP."' WHERE `Login` = '".$Login."'"))
  27. {
  28. echo ''.$this->Green($this->Lang['24']).'<br><a href="'.$this->Adres.'" style="color: green; text-align: center; font-weight: bold;">'.$this->Green($this->Lang['21']).'</a>';
  29. $_SESSION['Login'] = $this->User->Login;
  30. $_SESSION['Czas'] = $this->User->Time;
  31. }
  32. {
  33. echo ''.$this->Error($this->Lang['52']).'(CODE #2)';
  34. }
  35. }
  36. else
  37. {
  38. echo $this->Error(''.$this->Lang[20].' '.$this->Lang[47].'');
  39. }
  40. }
  41. }
  42. }
  43. }

Wywoływana jest ona z poziomu konstruktora głównego obiektu skryptu, gdy na podstawie zmiennej $_GET['idz-do'] w instrukcji switch wywołuje/dołączam odpowiednie funkcje/pliki.

Funkcje Error i Green "upiększają" tekst podany w argumencie, dzięki czemu wygląda on jak komunikat błędu lub powodzenia akcji.

$this-Lang - "tablica językowa", dołączana w konstruktorze obiektu User

Prosiłbym o ogólną opinie na temat funkcji. Jakie są zagrożenia płynące z używania takowej funkcji??

2. Jak mogę uzyskać dostęp do pola obiektu głównego z obiektu podrzędnego?? Przykład: w obiekcie głównym Gra mam pole $Lang i chcę go użyć w obiekcie podrzędnym User.

3. Czy warto przechowywać obiekt w sesji?? Przykład pliku index.php:
  1. <?php
  2. include("core.php");
  3. if(isset($_SESSION['Gra']))
  4. $Gra = $_SESSION['Gra'];
  5. else
  6. $Gra = new Game();
  7.  
  8. $_SESSION['Gra'] = $Gra;
  9. ?>


Pozdrawiam i oczekuję na odpowiedź winksmiley.jpg
Fifi209
Kupa zbędnego kodu:
  1.  
  2. if(isset($_POST['login']))
  3.  
  4. {
  5.  
  6. if(!$Login | !$Hasło)
  7.  
  8. {
  9.  
  10. echo $this->Error(''.$this->Lang[20].' '.$this->Lang[22].'');
  11.  
  12. }
  13.  
  14. else
  15.  
  16. {
  17.  
  18. $Query = mysql_fetch_array(mysql_query("SELECT `Login`, `Haslo`, `IP` FROM `users` WHERE `Login` = '".$Login."'"));
  19.  
  20. $Check = mysql_num_rows(mysql_query("SELECT `Login`, `Haslo` FROM `users` WHERE `Login` = '".$Login."'"));
  21.  
  22. if($Check == 0)
  23.  
  24. {
  25.  
  26. echo $this->Error(''.$this->Lang[20].' '.$this->Lang[23].'');
  27.  
  28. }


Ale po kolei:
  1. if(isset($_POST['login']))

Przecież login podajesz jako parametr funkcji !

  1. if(!$Login | !$Hasło)

A nie miało być ||

  1. $Query = mysql_fetch_array(mysql_query("SELECT `Login`, `Haslo`, `IP` FROM `users` WHERE `Login` = '".$Login."'"));
  2.  
  3. $Check = mysql_num_rows(mysql_query("SELECT `Login`, `Haslo` FROM `users` WHERE `Login` = '".$Login."'"));
  4.  
  5. if($Check == 0)

Czemu dwa zapytania...? Sam się zastanów.


Co do obiektu w sesji - wszystko zależy od tego do czego on jest wykorzystany.
marcio
Cytat
2. Jak mogę uzyskać dostęp do pola obiektu głównego z obiektu podrzędnego?? Przykład: w obiekcie głównym Gra mam pole $Lang i chcę go użyć w obiekcie podrzędnym User


Zalezy co masz na mysli mowiac Podrzedny obietkt, rodzic-dziecko czy jako?

Spawnm
Przenoszę.
dyndel
Cytat
Ale po kolei:

  1. if(isset($_POST['login']))


Przecież login podajesz jako parametr funkcji !

To nie jest Login winksmiley.jpg To atrybut `name` input'a typu submit winksmiley.jpg

Cytat
  1. if(!$Login | !$Hasło)


A nie miało być ||

Tu jest mój błąd(O dziwo działało w 100% haha.gif)

Cytat
  1. $Query = mysql_fetch_array(mysql_query("SELECT `Login`, `Haslo`, `IP` FROM `users` WHERE `Login` = '".$Login."'"));
  2.  
  3. $Check = mysql_num_rows(mysql_query("SELECT `Login`, `Haslo` FROM `users` WHERE `Login` = '".$Login."'"));
  4.  
  5. if($Check == 0)



Czemu dwa zapytania...? Sam się zastanów.


mysql_num_rows() przyjmuje jako parametr wynik funkcji mysql_query(), więc nie mogłem dać:
  1. $Check = mysql_num_rows($Query);

Chyba, że chodzi Ci o:
  1. $Zapyt = "SELECT `Login`, `Haslo`, `IP` FROM `users` WHERE `Login` = '".$Login."'";
  2.  
  3. $Query = mysql_fetch_array(mysql_query($Zapyt));
  4.  
  5. $Check = mysql_num_rows(mysql_query($Zapyt));
  6.  
  7. if($Check == 0)

[/php]
...ale to tylko 40 znaków różnicy.

Cytat
Co do obiektu w sesji - wszystko zależy od tego do czego on jest wykorzystany.


Właściwie to do dosłownie wszystkiego, np. połączenie z bazą danych, ustawienia zegara, daty, języka oraz do wygenerowania ciała strony.

Cytat
Zalezy co masz na mysli mowiac Podrzedny obietkt, rodzic-dziecko czy jako?

Heh, nawet nie wiem, to moje początki z OOP'em. Chyba jednak to relacja rodzic-dziecko, obiekt "podrzędny" jest inicjowany w obiekcie "nadrzędnym".

Cytat
Przenoszę.

Heh, nie zauważyłem subforum "Opinie", przepraszam winksmiley.jpg

PS. To moje początki z OOP'em, więc wybaczcie lamerstwo winksmiley.jpg

PS2. Czy w PHP, podobnie jak w C++ należy usuwać nieużywane obiekty?? Bo właściwie nie zależy mi na pamięci biggrin.gif
Fifi209
Cytat(dyndel @ 15.08.2009, 18:45:58 ) *
To nie jest Login winksmiley.jpg To atrybut `name` input'a typu submit winksmiley.jpg

I tak nie powinno być tego w klasie, gdyż przestaje być "uniwersalna".

Cytat(dyndel @ 15.08.2009, 18:45:58 ) *
mysql_num_rows() przyjmuje jako parametr wynik funkcji mysql_query(), więc nie mogłem dać:
  1. $Check = mysql_num_rows($Query);

Chyba, że chodzi Ci o:
  1. $Zapyt = "SELECT `Login`, `Haslo`, `IP` FROM `users` WHERE `Login` = '".$Login."'";
  2.  
  3. $Query = mysql_fetch_array(mysql_query($Zapyt));
  4.  
  5. $Check = mysql_num_rows(mysql_query($Zapyt));
  6.  
  7. if($Check == 0)

[/php]
...ale to tylko 40 znaków różnicy.

Ale o jedno zapytanie do bazy mniej...to bardzo dużo w tym momencie.

Cytat(dyndel @ 15.08.2009, 18:45:58 ) *
Właściwie to do dosłownie wszystkiego, np. połączenie z bazą danych, ustawienia zegara, daty, języka oraz do wygenerowania ciała strony.

Nie ma chyba sensu trzymanie takich obiektów w bazie...

Cytat(dyndel @ 15.08.2009, 18:45:58 ) *
PS2. Czy w PHP, podobnie jak w C++ należy usuwać nieużywane obiekty?? Bo właściwie nie zależy mi na pamięci biggrin.gif

W php obiekt sam jest niszczony (chyba podobnie jak w JAVIE).
dyndel
Cytat(fifi209 @ 15.08.2009, 19:55:34 ) *
I tak nie powinno być tego w klasie, gdyż przestaje być "uniwersalna".


OK, to będzie zmienione, może np. przekazywać $_POST['Login'] bezpośrednio do konstruktora??

[quote name='fifi209' date='15.08.2009, 19:55:34 ' post='648988']
Ale o jedno zapytanie do bazy mniej...to bardzo dużo w tym momencie.
[/qutoe]

Tu też mnie przekonałeś biggrin.gif

[quote name='fifi209' date='15.08.2009, 19:55:34 ' post='648988']
Nie ma chyba sensu trzymanie takich obiektów w bazie...
[/qutoe]
Nie chodzi o bazę, tylko o sesję winksmiley.jpg Żeby przy każdym wywołaniu strony nie trzeba było tworzyć nowego obiektu, byłby "wczytywany" z sesji.
Fifi209
Cytat(dyndel @ 15.08.2009, 19:06:03 ) *
OK, to będzie zmienione, może np. przekazywać $_POST['Login'] bezpośrednio do konstruktora??

Nie, przekazuj ją bezpośrednio do tej metody nie musi "cała klasa" wiedzieć o tym. (w sensie potrzebne Ci to tylko dla jednej metody)

Cytat(dyndel @ 15.08.2009, 19:06:03 ) *
Nie chodzi o bazę, tylko o sesję winksmiley.jpg Żeby przy każdym wywołaniu strony nie trzeba było tworzyć nowego obiektu, byłby "wczytywany" z sesji.

Wiem, zamyśliłem się. Ale to sesje miałem na myśli.

Obiekt możesz przetrzymywać w cache w postaci zserializowanej i myślę, że tylko wtedy gdy jego tworzenie zabiera sporo zasobów/czasu.
dyndel
Cytat(fifi209 @ 15.08.2009, 20:15:29 ) *
Nie, przekazuj ją bezpośrednio do tej metody nie musi "cała klasa" wiedzieć o tym. (w sensie potrzebne Ci to tylko dla jednej metody)


Jako argument?? To bez znaczenia, bo funkcja jest wywoływana z poziomu konstruktora winksmiley.jpg
Fifi209
Cytat(dyndel @ 15.08.2009, 19:42:42 ) *
Jako argument?? To bez znaczenia, bo funkcja jest wywoływana z poziomu konstruktora winksmiley.jpg

Chcesz powiedzieć, że zrobiłeś klasę z jedną metodą? smile.gif

Poza tym chyba powinieneś dać więcej kodu.
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.