Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [OOP] problemy początkującego - rejestracja
szczypior
post
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 5.02.2007

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


Witam

Postanowiłem spróbować swoich sił w OOP, na przykładzie skryptu rejestracji użytkowników. Napisałem coś takiego i o dziwo działa (IMG:style_emoticons/default/winksmiley.jpg) Gdy dane są poprawne dodaje użytkownika, gdy nie to nie dodaje, ale za to również nie wyświetla komunikatu. Moja prośba do Was, doświadczonych w temacie osób, to zobaczenie czy ten kod jest napisany poprawnie (zgodnie ze sztuką), co można w nim ulepszyć i jak najlepiej rozwiązać wyświetlanie komunikatów, które w tej formie nie działają.

Za wszelkie opinie, porady serdecznie dziękuję(IMG:style_emoticons/default/smile.gif)

  1. class new_user
  2. {
  3. public $login;
  4. public $pass;
  5. public $re_pass;
  6. public $email;
  7.  
  8. function validate($dane)
  9. {
  10. $dane = htmlspecialchars($dane, ENT_QUOTES);
  11. $dane = mysql_real_escape_string($dane);
  12. {
  13. $dane = addslashes ($dane);
  14. }
  15. return $dane;
  16. }
  17.  
  18. function check_login ()
  19. {
  20. if ($this->login==$this->validate($this->login))
  21. {
  22. $query = mysql_query('SELECT id FROM test WHERE login = "'.$this->login.'"') or die (mysql_error());
  23. if (mysql_num_rows($query) != 0)
  24. {
  25. // login zajęty
  26. $komunikat = 'Wybrany login jest zajęty';
  27. return false;
  28. }
  29. else
  30. {
  31. // login wolny
  32. return $this->login;
  33. }
  34. }
  35. else
  36. {
  37. $komunikat = 'Login zawiera niedozwolone znaki';
  38. return false;
  39. }
  40. }
  41.  
  42. function check_pass ()
  43. {
  44. if ($this->pass==$this->validate($this->pass))
  45. {
  46. if ($this->pass==$this->re_pass)
  47. {
  48. if (strlen($this->pass)>5)
  49. {
  50. return md5($this->pass);
  51. }
  52. else
  53. {
  54. $komunikat = 'Podane hasło jest za krótkie (min. 6 znaków)';
  55. return false;
  56. }
  57. }
  58. else
  59. {
  60. $komunikat = 'Podane hasła są różne';
  61. return false;
  62. }
  63. }
  64. else
  65. {
  66. $komunikat = 'Hasło zawiera niedozwolone znaki';
  67. return false;
  68. }
  69.  
  70. }
  71.  
  72. function check_email ()
  73. {
  74. if (ereg("^[a-z0-9_\\.-]+@([a-z0-9_-]+\\.)+[a-z]{2,}$", $this->email))
  75. {
  76. return $this->email;
  77. }
  78. else
  79. {
  80. $komunikat = 'Podaj poprawny adres e-mail';
  81. return false;
  82. }
  83. }
  84.  
  85. function add_user ()
  86. {
  87. if($this->check_login() && $this->check_pass() && $this->check_email())
  88. {
  89. mysql_query("INSERT INTO test(login,pass,email) VALUES('".$this->check_login()."','".$this->check_pass()."','".$this->check_email()."')");
  90. {
  91. return true;
  92. }
  93. else
  94. {
  95. return false;
  96. }
  97. }
  98. }
  99.  
  100. }
  101.  
  102. $new = new new_user;
  103. $new->login = 'ssssss';
  104. $new->pass = 'aaaaaaaaa';
  105. $new->re_pass = 'aaaaaaaaa';
  106. $new->email = 'ttttt@gggggg.pl';
  107. $nowy = $new->add_user($new);
  108. echo $komunikat;
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
szczypior
post
Post #2





Grupa: Zarejestrowani
Postów: 98
Pomógł: 0
Dołączył: 5.02.2007

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


Cytat
2. Metoda validate - przecież ona niczego nie sprawdza - jedyne co robi to przygotowuje dane do zapisu do bazy.

Metoda ta usuwa, zastępuje niedozwolone znaki, następnie w ifie porównuję login wprowadzony przez użytkownika z tym, który został przepuszczony przez validację. Jeśli oba są jednakowe to login uznany jest za poprawny.

Cytat
2.1. Tym powinno zajmować się PDO (czy coś takiego).

PDO będzie, nie użyłem go tylko w tym kodzie "szkoleniowym"

Cytat
2.2. Usuwanie "dobrodziejstw" magic quotes powinno być raczej gdzie indziej.

Chodzi Ci o to, że powinno być uaktywnione na serwerze?

Cytat
5. Twój obiekt to: reprezentant użytkownika, walidator danych z formularza, warstwa zapisująca dane po rejestracji, jakiś ogólny filtr dla danych trafiających do bazy - a jedna z podstawowych zasad OOP brzmi: jeden obiekt - jedno zadanie.

Nie bardzo rozumiem, co i jak mam jeszcze podzielić. Możesz to napisać łopatologiczniej? (IMG:style_emoticons/default/winksmiley.jpg)

Poniżej kod po poprawkach, proszę o kolejne uwagi i wskazówki:)

  1.  
  2. try {
  3. $pdo = new PDO('mysql:host=localhost;dbname=baza', 'log', 'pass');
  4. $pdo -> query("SET NAMES 'utf8'");
  5. //echo 'Połączenie nawiązane!';
  6. }
  7. catch(PDOException $e)
  8. {
  9. echo 'Połączenie nie mogło zostać utworzone: ' . $e->getMessage();
  10. die;
  11. }
  12.  
  13. class user
  14. {
  15. public $login;
  16. public $pass;
  17. public $re_pass;
  18. public $email;
  19.  
  20. private $pdo; //obiekt klasy PDO
  21.  
  22.  
  23. public function __construct(&$pdo)
  24. {
  25. $this->pdo =& $pdo; //przekazanie obiektu PDO do klasy.
  26. }
  27.  
  28.  
  29. function validate($dane)
  30. {
  31. $dane = htmlspecialchars($dane, ENT_QUOTES);
  32. //$dane = mysql_real_escape_string($dane);
  33. {
  34. $dane = addslashes ($dane);
  35. }
  36. return $dane;
  37. }
  38.  
  39. function check_login ()
  40. {
  41. if ($this->login != $this->validate($this->login))
  42. {
  43. throw new Exception('Login zawiera niedozwolone znaki');
  44. }
  45.  
  46. $sql = "SELECT id FROM `test` WHERE login= :login";
  47. $start = $this->pdo->prepare($sql);
  48. $start->bindParam(':login' , $this->login , PDO::PARAM_STR);
  49. $start->execute();
  50. $result=$start->rowCount();
  51. $start->closeCursor();
  52.  
  53. //$query = mysql_query('SELECT id FROM test WHERE login = "'.$this->login.'"') or die (mysql_error());
  54.  
  55. if ($result != 0)
  56. {
  57. throw new Exception('Wybrany login jest zajęty');
  58. }
  59. return $this->login;
  60. }
  61.  
  62. function check_pass ()
  63. {
  64. if ($this->pass != $this->validate($this->pass))
  65. {
  66. throw new Exception('Hasło zawiera niedozwolone znaki');
  67. }
  68.  
  69. if ($this->pass != $this->re_pass)
  70. {
  71. throw new Exception('Podane hasła są różne');
  72. }
  73.  
  74. if (strlen($this->pass)<6)
  75. {
  76. throw new Exception('Podane hasło jest za krótkie (min. 6 znaków)');
  77. }
  78. return md5($this->pass);
  79. }
  80.  
  81. function check_email ()
  82. {
  83. if (filter_var($this->email, FILTER_VALIDATE_EMAIL))
  84. {
  85. return $this->email;
  86. }
  87. throw new Exception('Podaj poprawny adres e-mail');
  88. }
  89.  
  90. function save()
  91. {
  92. if($this->check_login() && $this->check_pass() && $this->check_email())
  93. {
  94. //mysql_query("INSERT INTO test(login,pass,email) VALUES('".$this->check_login()."','".$this->check_pass()."','".$this->check_email()."')");
  95.  
  96. $sql = "INSERT INTO `test` (login,pass,email) VALUES (:login,:pass,:email)";
  97. $start = $this->pdo->prepare($sql);
  98. $start->bindParam(':login' , $this->check_login() , PDO::PARAM_STR);
  99. $start->bindParam(':pass' , $this->check_pass() , PDO::PARAM_STR);
  100. $start->bindParam(':email' , $this->check_email() , PDO::PARAM_STR);
  101. $result=$start->execute();
  102. $start->closeCursor();
  103. echo $result;
  104. if ($result == 1)
  105. {
  106. return true;
  107. }
  108. else
  109. {
  110. throw new Exception('Wystąpił błąd podczas dodawania użytkownika.');
  111. }
  112. }
  113. }
  114.  
  115. }
  116.  
  117. try
  118. {
  119. $new = new user($pdo);
  120. $new->login = 'ssss#%@#&;"sg/s0aa';
  121. $new->pass = 'aaaaaaaaa';
  122. $new->re_pass = 'aaaaaaaaa';
  123. $new->email = 'tttttg@ggggg.pl';
  124. $new->save();
  125. echo 'Użytkownik dodany pomyślnie';
  126. }
  127. catch (Exception $error)
  128. {
  129. echo $error->getMessage();
  130. }
  131.  
  132.  


Za dalsze uwagi, będę bardzo wdzięczny (IMG:style_emoticons/default/smile.gif)

W kodzie, jak widać użyłem już PDO. Co jeszcze można/należałoby poprawić ?(IMG:style_emoticons/default/smile.gif)

Ten post edytował szczypior 19.09.2010, 18:23:46
Go to the top of the page
+Quote Post

Posty w temacie


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: 7.10.2025 - 04:03