Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Ocena skryptu logowania
dyndel
post
Post #1





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Rusinów

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


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ź (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Fifi209
post
Post #2





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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.
Go to the top of the page
+Quote Post
marcio
post
Post #3





Grupa: Zarejestrowani
Postów: 2 291
Pomógł: 156
Dołączył: 23.09.2007
Skąd: ITALY-MILAN

Ostrzeżenie: (10%)
X----


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?

Go to the top of the page
+Quote Post
Spawnm
post
Post #4





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




Przenoszę.
Go to the top of the page
+Quote Post
dyndel
post
Post #5





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Rusinów

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


Cytat
Ale po kolei:

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


Przecież login podajesz jako parametr funkcji !

To nie jest Login (IMG:style_emoticons/default/winksmiley.jpg) To atrybut `name` input'a typu submit (IMG:style_emoticons/default/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% (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/winksmiley.jpg)

PS. To moje początki z OOP'em, więc wybaczcie lamerstwo (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/biggrin.gif)
Go to the top of the page
+Quote Post
Fifi209
post
Post #6





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


Cytat(dyndel @ 15.08.2009, 18:45:58 ) *
To nie jest Login (IMG:style_emoticons/default/winksmiley.jpg) To atrybut `name` input'a typu submit (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/biggrin.gif)

W php obiekt sam jest niszczony (chyba podobnie jak w JAVIE).
Go to the top of the page
+Quote Post
dyndel
post
Post #7





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Rusinów

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


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ś (IMG:style_emoticons/default/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ę (IMG:style_emoticons/default/winksmiley.jpg) Żeby przy każdym wywołaniu strony nie trzeba było tworzyć nowego obiektu, byłby "wczytywany" z sesji.
Go to the top of the page
+Quote Post
Fifi209
post
Post #8





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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ę (IMG:style_emoticons/default/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.
Go to the top of the page
+Quote Post
dyndel
post
Post #9





Grupa: Zarejestrowani
Postów: 18
Pomógł: 0
Dołączył: 24.06.2009
Skąd: Rusinów

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


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 (IMG:style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
Fifi209
post
Post #10





Grupa: Zarejestrowani
Postów: 4 655
Pomógł: 556
Dołączył: 17.03.2009
Skąd: Katowice

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


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

Chcesz powiedzieć, że zrobiłeś klasę z jedną metodą? (IMG:style_emoticons/default/smile.gif)

Poza tym chyba powinieneś dać więcej kodu.

Ten post edytował fifi209 19.08.2009, 00:54:00
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 22.08.2025 - 20:38