Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Optymalizacja klasy do obsługi użytkownika
rav1989
post
Post #1





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 5.07.2007

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


Witam

Napisałem klasę która ma obsługiwać użytkownika wydaje mi się, że jest ona nieoptymalna... wstawiam ją aby ktoś z większym doświadczeniem ją obejrzał i mnie nakierował co można zrobić lepiej i co mam poprawić (IMG:style_emoticons/default/biggrin.gif)

Klasa:
  1.  
  2. define("MySql_Host", "localhost");
  3. define("MySql_Login", "root");
  4. define("MySql_Password", "");
  5. define("MySql_DbName", "test");
  6. define("MySql_TPrefix", "");
  7.  
  8. define("MODE_USER",0);
  9. define("MODE_MOD",1);
  10. define("MODE_ADMIN",2);
  11.  
  12. function removeSlashes(&$value)
  13. {
  14. if(is_array($value))
  15. {
  16. return array_map('removeSlashes', $value);
  17. }
  18. else
  19. {
  20. return stripslashes($value);
  21. }
  22. }
  23.  
  24. class User{
  25. private $id;
  26. private $email;
  27. private $haslo;
  28.  
  29. public $nazwa;
  30. public $opis;
  31. public $avatar;
  32. public $mode;
  33. public $urls;
  34. private $sesja;
  35.  
  36. private $pdo;
  37.  
  38. public function __construct($email_ = null, $haslo_ = null){
  39. $this->pdo = new PDO('mysql:host='.MySql_Host.';dbname='.MySql_DbName, MySql_Login , MySql_Password);
  40. $this->pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  41.  
  42. if(isset($email_) and isset($haslo_)){
  43. $this->email = $email_;
  44. $this->haslo = md5(sha1($haslo_).sha1('TuJestSol'));
  45. }elseif(isset($_SESSION['token'])){
  46. $this->sesja = $_SESSION['token'];
  47. $this->Load();
  48. }else die('Ups! Odwiedź rejestrację!');
  49. }
  50.  
  51. private function mysql_insert($table, $inserts) {
  52. $values = array_map("removeSlashes", array_values($inserts));
  53. $keys = array_keys($inserts);
  54.  
  55. $query = 'INSERT INTO `'.MySql_TPrefix.$table.'` (`'.implode('`,`', $keys).'`) VALUES (\''.implode('\',\'', $values).'\')';
  56. try{
  57. return $this->pdo -> exec($query);
  58. }
  59. catch(PDOException $e)
  60. {
  61. echo 'Wystąpił błąd biblioteki PDO: ' . $e->getMessage();
  62. return false;
  63. }
  64. }
  65.  
  66. public function Rejestruj($nazwa_){
  67. $this->nazwa = $nazwa_;
  68. $this->mode = MODE_USER;
  69. $stmt = $this->pdo -> query('SELECT * FROM `users` WHERE `haslo`="'.$this->haslo.'" and `email`="'.$this->email.'"');
  70. if($stmt->fetch()) return false;
  71. $tmp = $this->mysql_insert('users',array('nazwa'=>$this->nazwa, 'haslo'=>$this->haslo, 'email'=>$this->email, 'mode'=>$this->mode));
  72.  
  73. if($tmp)
  74. return true;
  75. return false;
  76. }
  77.  
  78. public function Loguj(){
  79. try
  80. {
  81. $_SESSION['token'] = md5(rand());
  82. $this->sesja = $_SESSION['token'];
  83. $this->pdo -> query('UPDATE `users` SET `sesja`="'.$_SESSION['token'].'" WHERE `haslo`="'.$this->haslo.'" and `email`="'.$this->email.'"');
  84. }
  85. catch(PDOException $e)
  86. {
  87. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  88. return null;
  89. }
  90. }
  91. public function Wyloguj(){
  92. try
  93. {
  94. $this->pdo -> query('UPDATE `users` SET `sesja`="NULL" WHERE `sesja`="'.$this->sesja.'"');
  95. }
  96. catch(PDOException $e)
  97. {
  98. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  99. return null;
  100. }
  101. }
  102.  
  103. public function __set($name,$value){
  104. $this->$name($value);
  105. }
  106. private function Load(){
  107. try
  108. {
  109. $stmt = $this->pdo -> query('SELECT * FROM `users` WHERE `sesja`="'.$this->sesja.'"');
  110. $row = $stmt->fetch();
  111. $stmt -> closeCursor();
  112. $urls = $this->pdo -> query('SELECT url FROM `user_sites` WHERE `users_id`="'.$row['id'].'"');
  113. foreach($urls as $url){
  114. $this->urls[] = base64_decode($url['url']);
  115. }
  116. $urls -> closeCursor();
  117. $this->opis = $row['opis'];
  118. $this->avatar = $row['avatar'];
  119. $this->nazwa = $row['nazwa'];
  120. $this->mode = $row['mode'];
  121. $this->id = $row['id'];
  122. }
  123. catch(PDOException $e)
  124. {
  125. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  126. return null;
  127. }
  128. }
  129.  
  130. public function AddUrl($url){
  131. $url = base64_encode($url);
  132. $stmt = $this->pdo -> query('SELECT * FROM `user_sites` WHERE `url`="'.$url.'" and `users_id`="'.$this->id.'"');
  133. if($stmt->fetch()) return false;
  134. $tmp = $this->mysql_insert('user_sites',array('url'=>$url, 'users_id'=>$this->id));
  135. $this->urls[] = base64_decode($url);
  136.  
  137. if($tmp)
  138. return true;
  139. return false;
  140. }
  141.  
  142. public function Opis($value){
  143. $this->opis = $value;
  144. try
  145. {
  146. $this->pdo -> query('UPDATE `users` SET `opis`="'.$this->opis.'" WHERE `sesja`="'.$this->sesja.'"');
  147. }
  148. catch(PDOException $e)
  149. {
  150. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  151. return null;
  152. }
  153. }
  154.  
  155. public function Avatar($value){
  156. $this->avatar = $value;
  157. try
  158. {
  159. $this->pdo -> query('UPDATE `users` SET `avatar`="'.$this->avatar.'" WHERE `sesja`="'.$this->sesja.'"');
  160. }
  161. catch(PDOException $e)
  162. {
  163. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  164. return null;
  165. }
  166. }
  167.  
  168. public function Mode($value){
  169. $this->mode = $value;
  170. try
  171. {
  172. $this->pdo -> query('UPDATE `users` SET `mode`="'.$this->mode.'" WHERE `sesja`="'.$this->sesja.'"');
  173. }
  174. catch(PDOException $e)
  175. {
  176. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  177. return null;
  178. }
  179. }
  180.  
  181.  
  182.  
  183. }


Logowanie:
  1. require_once('class/user.class.php');
  2. $user = new User('test','test');
  3. $user -> Loguj();


Update/Odczyt danych:
  1. require_once('class/user.class.php');
  2. $user = new User();
  3. $user->Opis = 'adad';
  4. $user->AddUrl ='http://wp.pl';
  5. echo $user -> opis;
  6. print_r($user -> urls);


Wylogowanie:
  1. require_once('class/user.class.php');
  2. $user = new User();
  3. $user->Wyloguj();


Struktura SQL:
  1. CREATE TABLE IF NOT EXISTS `users` (
  2. `id` INT NOT NULL AUTO_INCREMENT ,
  3. `nazwa` VARCHAR(45) NULL ,
  4. `email` VARCHAR(45) NULL ,
  5. `haslo` VARCHAR(45) NULL ,
  6. `opis` TEXT NULL ,
  7. `avatar` VARCHAR(128) NULL ,
  8. `mode` INT NULL ,
  9. `sesja` VARCHAR(45) NULL ,
  10. PRIMARY KEY (`id`) )
  11. ENGINE = MyISAM
  12. DEFAULT CHARACTER SET = utf8
  13. COLLATE = utf8_general_ci
  14. PACK_KEYS = DEFAULT;

Pozdrawiam
Rav
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Valker
post
Post #2





Grupa: Zarejestrowani
Postów: 40
Pomógł: 5
Dołączył: 24.08.2007
Skąd: Łódź

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


Może nie jestem jakimś profesjonalistą, ale zmienił bym parę rzeczy:

1. Wyświetlanie błędu mysql w przypadku braku połączenia jest bez sensu. Nie lepiej po prostu zostawić: "Błąd połączenia z bazą danych".
2. Używanie die() w środku klasy (szczególnie w konstruktorze) też nie jest według mnie najlepszym błędem. Jak dla mnie powinien być zwracany jakiś kod błędu i dopiero wtedy pokazywany błąd. Poza tym korzystanie z die() powoduje przerwanie wykonywanie skryptu. (o ile nie jest to biała strona bez html, dużo znaczników html nie zostanie zakończonych)
3. Tworzenie instancji klasy za każdym razem jak chcesz wykonać jakieś operacje na koncie użytkownika też trochę (jak dla mnie) jest źle pomyślane. Za każdym razem jak dokonujesz zmian jest wcześniej wykonywany kod logowania (a przez to jest dużo nie potrzebnych zapytań do bazy). Wiem, że wszyscy mówią, że korzystanie ze wzorcu Signleton jest złe i w ogóle się nie powinno, ale jak dla mnie to lepsze rozwiązanie niż wykonywanie co chwile kodu logowania.
4. Wykonywanie zapytania do bazy przy wylogowywaniu też jest zbędne. Wystarczy, że z sesji usuniesz zmienną token ;D

To chyba wszystko co od razu rzuciło mi się na oczy, pewnie jest jeszcze parę rzeczy, które wymagały by poprawy, ale może niech pomyśli nad tym ktoś bardziej doświadczony ;P

Pozdr,
Valker
Go to the top of the page
+Quote Post
rav1989
post
Post #3





Grupa: Zarejestrowani
Postów: 66
Pomógł: 0
Dołączył: 5.07.2007

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


Cytat(Valker @ 22.04.2011, 01:22:26 ) *
1. Wyświetlanie błędu mysql w przypadku braku połączenia jest bez sensu. Nie lepiej po prostu zostawić: "Błąd połączenia z bazą danych".
2. Używanie die() w środku klasy (szczególnie w konstruktorze) też nie jest według mnie najlepszym błędem. Jak dla mnie powinien być zwracany jakiś kod błędu i dopiero wtedy pokazywany błąd. Poza tym korzystanie z die() powoduje przerwanie wykonywanie skryptu. (o ile nie jest to biała strona bez html, dużo znaczników html nie zostanie zakończonych)
3. Tworzenie instancji klasy za każdym razem jak chcesz wykonać jakieś operacje na koncie użytkownika też trochę (jak dla mnie) jest źle pomyślane. Za każdym razem jak dokonujesz zmian jest wcześniej wykonywany kod logowania (a przez to jest dużo nie potrzebnych zapytań do bazy). Wiem, że wszyscy mówią, że korzystanie ze wzorcu Cjest złe i w ogóle się nie powinno, ale jak dla mnie to lepsze rozwiązanie niż wykonywanie co chwile kodu logowania.
4. Wykonywanie zapytania do bazy przy wylogowywaniu też jest zbędne. Wystarczy, że z sesji usuniesz zmienną token ;D


1. To jest na razie do testów, później dam funkcję zapisującą logi, oraz będzie się pojawiał stosowny komunikat na stronie (IMG:style_emoticons/default/biggrin.gif)
2. Faktycznie, trochę nie pomyślałem... myślisz, że jak dam przekierowanie za pomocą header do strony rejestracji to będzie ok??
3. Hmm... nie słyszałem to wzorcu Signleton więc go nie zastosowałem, natomiast przed chwilą wlazłem z ciekawości na http://phpedia.pl/wiki/Singleton i poczytałem, bardzo ciekawe to jest, tylko jak ja będę miał wszystko w osobnych plikach to nie za bardzo potrafię sobie wyobrazić jak to będzie działać...
4. Faktycznie :F jedno zapytanie do bazy mniej....

Dziękuję za wskazanie tych błędów, zmiany zostaną wprowadzone (IMG:style_emoticons/default/biggrin.gif) natomiast ja czekam na dalsze propozycję optymalizacji...

Pozdrawiam
Rav
Go to the top of the page
+Quote Post

Posty w temacie
- rav1989   Optymalizacja klasy do obsługi użytkownika   21.04.2011, 20:56:08
- - Valker   Może nie jestem jakimś profesjonalistą, ale zmieni...   22.04.2011, 00:22:26
|- - rav1989   Cytat(Valker @ 22.04.2011, 01:22:26 )...   22.04.2011, 11:23:29
- - misiek172   można wiele zmienić taka troszkę średnia ta klasa ...   22.04.2011, 11:45:21
- - rav1989   Cytat(misiek172 @ 22.04.2011, 12:45:2...   22.04.2011, 23:13:52
- - Dipter   1. Definiujesz dane do bazy danych, które równie d...   23.04.2011, 23:15:56
|- - rav1989   Nie wiedziałem, że jest aż tak źle... no cóż konie...   25.04.2011, 21:47:20
- - konole   Postaraj się trzymać stałego nazewnictwa. Nazwy fu...   25.04.2011, 21:58:56
|- - rav1989   Cytat(konole @ 25.04.2011, 22:58:56 )...   25.04.2011, 22:23:02
- - Dipter   1. Klasa pomocnicza - W konstruktorze klasy ustala...   25.04.2011, 22:41:02
|- - rav1989   Cytat1. Klasa pomocnicza - W konstruktorze klasy u...   26.04.2011, 13:15:27
- - Dipter   CytatCytat5. Znów wszystko jest namieszane jak lec...   26.04.2011, 14:16:06
|- - rav1989   Cytat1. HttpRequest - Dodałeś GET i POST, ale co z...   27.04.2011, 15:06:28
- - Dipter   CytatHmm... KodFatal error: Non-static method...   27.04.2011, 16:48:55
|- - rav1989   CytatBłąd jest chyba logicznie prosty (Niestety mó...   27.04.2011, 18:08:06
- - Dipter   Usunąłeś przed metodą w klasie DB magiczne słowo ...   27.04.2011, 18:59:39
|- - rav1989   Cytat(Dipter @ 27.04.2011, 19:59:39 )...   27.04.2011, 20:56:40
- - Dipter   Właśnie o to chodzi by usunąć tego statica, bo on ...   27.04.2011, 21:47:34
|- - rav1989   Cytat(Dipter @ 27.04.2011, 22:47:34 )...   27.04.2011, 22:01:58
- - Dipter   Przydać zawsze się przyda, lecz najpierw trzeba wy...   27.04.2011, 22:09:14
- - rav1989   Cytat(Dipter @ 27.04.2011, 23:09:14 )...   28.04.2011, 02:18:56


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 Aktualny czas: 9.10.2025 - 02:44