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
Dipter
post
Post #2





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

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


Cytat
Cytat
5. Znów wszystko jest namieszane jak leci. Musisz przemyśleć dokładnie jak to ma wyglądać.

Nie rozumiem... dlaczego jest namieszane?


Staraj się by jedno zajmowało się jednym, a drugie drugim.

1. HttpRequest - Dodałeś GET i POST, ale co z SERVER, REQUEST, SESSION, COOKIE etc. Poza tym nie lepiej by była to klasa statyczna, bądź Singleton by nie przekazywać non stop obiektu?
2. Klasa DB - Dobry pierwszy krok, ale Singleton z tego marny, właściwie w ogóle go brak (IMG:style_emoticons/default/tongue.gif) getInstance() powinien zwracać Ci obiekt klasy DB, oraz przy okazji klasy PDO.

Przykład:

  1.  
  2. class DB extends PDO {
  3.  
  4. static private $instance = null;
  5.  
  6. public function __construct() {}
  7.  
  8. static public function getInstance() {
  9. if(self::$instance === null) {
  10. self::$instance = new self();
  11. }
  12. return self::$instance;
  13. }
  14.  
  15. static public function connect($config = array()) {
  16. parent::__construct($config['dsn'], $config['username'], $config['password'], [...]);
  17. }
  18.  
  19. }
  20.  


I wykorzystanie na początku aplikacji?

  1.  
  2. DB::connect(array([...]));
  3.  
  4. DB::getInstance()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.  


3. Co do klasy User - To tutaj głównie mam zarzuty co do mieszania. Masz tutaj rejestracje, sprawdzanie, pobieranie informacji o użytkowniku oraz zwracanie czy to Admin, czy Moderator. Jeśli mowa tutaj o optymalizacji trzeba też wspomnieć o jakimś ładzie - Osobna klasa do rejestracji użytkownika, sprawdzania czy istnieje i innych. Inna znowu do pobierania danych użytkownika o id / nazwie x, oraz ew. rozszerzenie do klasy pobierającej dane, która ustali czy to Admin/Mod/Użytkownik czy ktokolwiek.

Życzę miłej pracy (IMG:style_emoticons/default/tongue.gif)
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
1. HttpRequest - Dodałeś GET i POST, ale co z SERVER, REQUEST, SESSION, COOKIE etc. Poza tym nie lepiej by była to klasa statyczna, bądź Singleton by nie przekazywać non stop obiektu?

Nie mam pojęcia jak to zrobić aby było to Singleton... natomiast dodałem SERVER i COOKIE (jakoś reszty nie potrzebuję) analogicznie jak zrobiłem to z GET i POST

Cytat
2. Klasa DB - Dobry pierwszy krok, ale Singleton z tego marny, właściwie w ogóle go brak (IMG:style_emoticons/default/tongue.gif) getInstance() powinien zwracać Ci obiekt klasy DB, oraz przy okazji klasy PDO.

Przykład:

  1.  
  2. class DB extends PDO {
  3.  
  4. static private $instance = null;
  5.  
  6. public function __construct() {}
  7.  
  8. static public function getInstance() {
  9. if(self::$instance === null) {
  10. self::$instance = new self();
  11. }
  12. return self::$instance;
  13. }
  14.  
  15. static public function connect($config = array()) {
  16. parent::__construct($config['dsn'], $config['username'], $config['password'], [...]);
  17. }
  18.  
  19. }
  20.  


I wykorzystanie na początku aplikacji?

  1.  
  2. DB::connect(array([...]));
  3.  
  4. DB::getInstance()->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  5.  

Hmm...
Kod
Fatal error: Non-static method PDO::__construct() cannot be called statically in C:\wamp\www\class\db.class.php on line 33
nie wiem co poszło nie tak...


Cytat
3. Co do klasy User - To tutaj głównie mam zarzuty co do mieszania. Masz tutaj rejestracje, sprawdzanie, pobieranie informacji o użytkowniku oraz zwracanie czy to Admin, czy Moderator. Jeśli mowa tutaj o optymalizacji trzeba też wspomnieć o jakimś ładzie - Osobna klasa do rejestracji użytkownika, sprawdzania czy istnieje i innych. Inna znowu do pobierania danych użytkownika o id / nazwie x, oraz ew. rozszerzenie do klasy pobierającej dane, która ustali czy to Admin/Mod/Użytkownik czy ktokolwiek.


Zrobiłem osobne klasy do sprawdzenia poziomu (Anonim, User, Admin)
  1. class CheckMode
  2. {
  3. static public function isAnonymous(User $user)
  4. {
  5. return ($user -> getMode() == MODE_GUEST ? true : false);
  6. }
  7.  
  8. static public function isAdmin(User $user)
  9. {
  10. return ($user -> getMode() == MODE_ADMIN ? true : false);
  11. }
  12.  
  13. static public function isUser(User $user)
  14. {
  15. return ($user -> getMode() == MODE_USER ? true : false);
  16. }
  17. }


Zrobiłem też osobne klasy do rejestracji oraz sprawdzania Usera (IMG:style_emoticons/default/biggrin.gif)

  1. class CheckUser
  2. {
  3. static public function run(httpRequest $req, DB $pdo)
  4. {
  5. $stmt = $pdo -> prepare('SELECT id, email, name, password, description, avatar, mode FROM '.MySql_TPrefix.'users WHERE email=:email AND password=:password');
  6. $stmt -> bindValue(':email', $req->getPost('email'), PDO::PARAM_STR);
  7. $stmt -> bindValue(':password', sha1(md5('@TuJestBardzo_').md5($req->getPost('haslo')).md5('_TrudnaSol@')), PDO::PARAM_STR);
  8. $stmt -> execute();
  9. $stmt -> setFetchMode(PDO::FETCH_CLASS, 'User', array(0 => $pdo, 1=>false));
  10. if($user = $stmt -> fetch())
  11. {
  12. $stmt -> closeCursor();
  13. return $user;
  14. }
  15. else
  16. {
  17. $stmt -> closeCursor();
  18. return null;
  19. }
  20. }
  21. }
  22.  
  23. class AddUser
  24. {
  25. static public function run(httpRequest $req, DB $pdo)
  26. {
  27. $result = User::checkUser($req,$pdo);
  28. if($result instanceof user){ return false; }
  29. $stmt = $pdo -> prepare('INSERT INTO '.MySql_TPrefix.'users (email, password, mode, name) VALUES (:email, :password, :mode, :name)');
  30. $stmt -> bindValue(':email', $req->getPost('email'), PDO::PARAM_STR);
  31. $stmt -> bindValue(':password', sha1(md5('@TuJestBardzo_').md5($req->getPost('haslo')).md5('_TrudnaSol@')), PDO::PARAM_STR);
  32. $stmt -> bindValue(':mode', MODE_USER, PDO::PARAM_INT);
  33. $stmt -> bindValue(':name', $req->getPost('nazwa'), PDO::PARAM_STR);
  34. $ile = $stmt -> execute();
  35. if($ile > 0)
  36. {
  37. return true;
  38. }
  39. else
  40. {
  41. return false;
  42. }
  43. }
  44. }


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: 4.10.2025 - 00:05