Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP]Klasa rejestracji - optymalizacja i błędy
Forum PHP.pl > Forum > Przedszkole
vegeta
  1. <?php
  2. class rejestracja {
  3. public $login;
  4. public $uwagi = '';
  5. private $mail;
  6. private $pass;
  7. private $pass2;
  8.  
  9. public function __construct($login, $mail, $pass, $pass2) {
  10. $this -> login = $login;
  11. $this -> mail = $mail;
  12. $this -> pass = $pass;
  13. $this -> pass2 = $pass2;
  14. }
  15.  
  16. public function SprawdzLogin() {
  17. if(strlen($this->login) > 20) {
  18. $this -> uwagi = 'Login jest za długi. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  19. } elseif(!preg_match('/^[a-zA-Z0-9_\-]+$/', $this->login)) {
  20. $this -> uwagi = 'Login posiada błędne znaki! <a href="rejestracja.php">Spróbuj ponownie.</a>';
  21. } elseif(1 > 0) {
  22. $this -> pre1 = baza::instance() -> prepare('SELECT id FROM users WHERE login = ? COLLATE utf8_bin limit 1');
  23. $this -> pre1 -> execute(array($this->login));
  24. if(($this -> pre1 -> rowCount()) > 0) { // jeśli login istnieje
  25. $this -> uwagi = 'Obywatel o takim loginie już istnieje. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  26. }
  27. }
  28. }
  29.  
  30. public function SprawdzMail() {
  31. if(strlen($this -> mail) > 45) {
  32. $this -> uwagi = 'E-mail jest za długi. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  33. } elseif(!preg_match('/^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$/i', $this -> mail)) {
  34. $this -> uwagi = 'Wpisany adres e-mail jest niepoprawny! <a href="rejestracja.php">Spróbuj ponownie.</a>';
  35. } elseif(1 > 0) {
  36. $this -> pre2 = baza::instance() -> prepare('SELECT id FROM users WHERE mail = ?');
  37. $this -> pre2 -> execute(array($this -> mail));
  38. if(($this -> pre2 -> rowCount()) > 0) { // jeśli mail istnieje
  39. $this -> uwagi = 'Obywatel o takim adresie e-mail już istnieje. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  40. }
  41. }
  42. }
  43.  
  44. public function SprawdzHaslo() {
  45. if(strlen($this -> pass) > 5) {
  46. $this -> uwagi = 'Hasło jest za krótkie. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  47. } elseif(!$this -> pass === $this -> pass2) {
  48. $this -> uwagi = 'Hasła się różnią. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  49. }
  50. }
  51.  
  52. public function Rejestruj() {
  53. $this -> pass = md5($this -> pass); // koduję hasło
  54. $this -> data = time(); // zapisuję datę rejestracji
  55. $this -> pre3 = baza::instance() -> prepare('INSERT INTO users (login, haslo, mail, data_rej) VALUES (:login, :pass, :mail, :data)');
  56. $this -> pre3 -> execute(array(':login' => $this -> login, ':pass' => $this -> pass, ':mail' => $this -> mail, ':data' => $this -> data));
  57. $this -> uwagi = 'Obywatelu <b>'.$this -> login.'</b>! Zostałeś przyjęty do państwa! <a href="logowanie.php">Zaloguj się!</a>';
  58. }
  59. }
  60. ?>
Kawałek z pliku rejestracji (formularz etc):
  1. if (isset($_POST['rejestruj'])) { // czy kliknął SUBMIT?
  2. if ($_POST['login'] != '' && $_POST['mail'] != '' && $_POST['pass'] != '' && $_POST['pass2'] != '') { // czy pola nie są puste?
  3. require_once 'klasy/rejestracja.php';
  4. $rejestracja = new rejestracja($_POST['login'], $_POST['mail'], $_POST['pass'], $_POST['pass2']);
  5. $rejestracja -> SprawdzLogin();
  6. if($rejestracja -> uwagi != '') {
  7. echo $rejestracja -> uwagi;
  8. } elseif($rejestracja -> uwagi = '') {
  9. $zapytania++;
  10. $rejestracja -> SprawdzMail();
  11. echo $rejestracja -> uwagi;
  12. } elseif($rejestracja -> uwagi != '') {
  13. echo $rejestracja -> uwagi;
  14. } elseif($rejestracja -> uwagi = '') {
  15. $zapytania++;
  16. $rejestracja -> SprawdzHaslo();
  17. } elseif($rejestracja -> uwagi != '') {
  18. echo $rejestracja -> uwagi;
  19. } else {
  20. $rejestracja -> Rejestruj();
  21. $zapytania++;
  22. echo $rejestracja -> uwagi;
  23. }
  24. }
  25. else { // a jak się czegoś zapomniało
  26. echo 'Brakuje danych! <a href="rejestracja.php">Spróbuj ponownie.</a>'; // to niech zacznie od nowa
  27. }
  28. }
  29. else {
  30. wyswietlanie formularza
Pytania:
1. Co robię źle?
2. Da się to jakoś napisać bardziej optymalnie?
Ilware
Przerzuć część walidacji na przeglądarkę np: długości wpisanych stringów.
Utwórz jedno połączenie do bazy danych w Classie ( stwórz własną klasę albo korzystaj z gotowej np. z PDO http://php.net/manual/en/book.pdo.php ) zamiast odnosić się do singletona ( baza::instance() ).
Dlaczego odnosisz się do tych zmiennych jako globalnych skoro niemi nie są ? => pre1 ,pre2 , pre3 ,data,ile2 ,ile1

po co tworzysz dodatkowe zmienne?
  1. $this -> ile1 = $this -> pre1 -> rowCount();
  2. if($this -> ile1 > 0)


zamiast

  1. if( ( $this -> pre1 -> rowCount() ) > 0)


użyj else zamiast
  1. elseif(1 > 0)


podziel klase na validatory i część wykonawczą,jak jakiś validator wywali to dopiero na końcu wyświetl zmienną uwagi

  1. if( $rejestracja -> SprawdzLogin() && $rejestracja -> SprawdzMail() && $rejestracja -> SprawdzHaslo() ){
  2. $rejestracja -> Rejestruj();
  3. }else{
  4. echo $rejestracja ->uwagi;
  5. }
vegeta
Cytat
Przerzuć część walidacji na przeglądarkę np: długości wpisanych stringów.

Pole login i mail na maxlength taki jak w klasie, pole mail jest type="email" (dla nowszych przeglądarek, starsze widzą to jako text). Dodatkowo dla bezpieczeństwa usera dodałem siłę hasła (skrypty JS nie mój).

Cytat
stwórz własną klasę albo korzystaj z gotowej np. z PDO

Ja korzystam z PDO. klasa Baza służy do połączenia z MySQL z wykorzystaniem PDO. Kod klasy: http://wklej.to/8SPv8 hash: 123

Cytat
Dlaczego odnosisz się do tych zmiennych jako globalnych skoro niemi nie są?

Czyli mam zrobić private $pre1; private $pre2; dla wszystkich takich zmiennych?

Cytat
po co tworzysz dodatkowe zmienne?

Poprawione


Cytat
użyj else zamiast

Poprawione

Cytat
podziel klase na validatory i część wykonawczą,jak jakiś validator wywali to dopiero na końcu wyświetl zmienną uwagi

Jak mam klasę przebudować?


----
Uaktualniony kod znajduje się w pierwszym poście.
Ilware
Zminiłem Twoją klasę na coś takiego
  1. <?php
  2. class rejestracja {
  3. public $login;
  4. public $uwagi = '';
  5. private $mail;
  6. private $pass;
  7. private $dbConnect = null;
  8.  
  9. public function __construct( $login, $mail, $pass ) {
  10. $this -> login = $login;
  11. $this -> mail = $mail;
  12. $this -> pass = $pass;
  13. $this->dbConnect = new Instancja_Klasy_Laczaca_Z_DB_Przez_PDO(); // pkt 1
  14.  
  15. }
  16.  
  17. public function SprawdzLogin() {
  18. if( strlen($this->login) > 20 ){
  19. $this -> uwagi = 'Login jest za długi. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  20. return false; //pkt 2
  21. }
  22. if( !preg_match( '/^[a-zA-Z0-9_\-]+$/', $this->login ) ){
  23. $this -> uwagi = 'Login posiada błędne znaki! <a href="rejestracja.php">Spróbuj ponownie.</a>';
  24. return false; //pkt 2
  25. }
  26. $this->dbConnect->prepare('SELECT id FROM users WHERE login = ? COLLATE utf8_bin limit 1');
  27. $this->dbConnect->execute( array( $this->login ) );
  28. if( $this->dbConnect->rowCount() > 0 ) { // jeśli login istnieje
  29. $this -> uwagi = 'Obywatel o takim loginie już istnieje. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  30. return false; //pkt 2
  31. }else{
  32. return true; //pkt 2
  33. }
  34. }
  35.  
  36. public function SprawdzMail() {
  37. if(strlen( $this -> mail ) > 45 ) {
  38. $this -> uwagi = 'E-mail jest za długi. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  39. return false; //pkt 2
  40. }
  41. if(!preg_match('/^[_\.0-9a-zA-Z-]+@([0-9a-zA-Z][0-9a-zA-Z-]+\.)+[a-zA-Z]{2,6}$/i', $this -> mail)) {
  42. $this -> uwagi = 'Wpisany adres e-mail jest niepoprawny! <a href="rejestracja.php">Spróbuj ponownie.</a>';
  43. return false; //pkt 2
  44. }
  45. $this->dbConnect->prepare('SELECT id FROM users WHERE mail = ?');
  46. $this->dbConnect->execute(array($this -> mail));
  47. if( ( $this->dbConnect->rowCount() ) > 0 ) { // jeśli mail istnieje
  48. $this -> uwagi = 'Obywatel o takim adresie e-mail już istnieje. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  49. return true; //pkt 2
  50. }else{
  51. return true; //pkt 2
  52. }
  53. }
  54.  
  55. public function SprawdzHaslo( $sPasswordConfirm ) {
  56. if(strlen($this -> pass) > 5) {
  57. $this -> uwagi = 'Hasło jest za krótkie. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  58. return false; //pkt 2
  59. }
  60. if( ! $this->pass == $sPasswordConfirm ) {
  61. $this->uwagi = 'Hasła się różnią. <a href="rejestracja.php">Spróbuj ponownie.</a>';
  62. return false; //pkt 2
  63. }
  64. return true; //pkt 2
  65. }
  66.  
  67. public function Rejestruj() {
  68. $this -> pass = md5($this -> pass."super tajny string znany tylko tobie zarejestrowany gdzieś w kodzie"); // koduję hasło // pkt 3
  69. $this->dbConnect-> prepare( 'INSERT INTO users (login, haslo, mail, data_rej) VALUES (:login, :pass, :mail, :data)');
  70. $this->dbConnect-> execute( array( ':login' => $this -> login, ':pass' => $this -> pass, ':mail' => $this -> mail, ':data' => 'NOW()' ) );
  71. $this -> uwagi = 'Obywatelu <b>'.$this -> login.'</b>! Zostałeś przyjęty do państwa! <a href="logowanie.php">Zaloguj się!</a>';
  72. }
  73. }

a samo wywołanie na coś takiego :
  1. <?php
  2. if ( isset( $_POST['rejestruj'] ) ) { // czy kliknął SUBMIT?
  3. if ( $_POST['login'] != '' && $_POST['mail'] != '' && $_POST['pass'] != '' && $_POST['pass2'] != '') { // czy pola nie są puste?
  4. require_once 'klasy/rejestracja.php';
  5. $rejestracja = new rejestracja( $_POST['login'], $_POST['mail'], $_POST['pass'] );
  6. if( $rejestracja -> SprawdzLogin() && $rejestracja -> SprawdzMail() && $rejestracja -> SprawdzHaslo( $_POST['pass2'] ) ){
  7. $rejestracja -> Rejestruj();
  8. }
  9. echo $rejestracja -> uwagi;
  10. }else { // a jak się czegoś zapomniało
  11. echo 'Brakuje danych! <a href="rejestracja.php">Spróbuj ponownie.</a>'; // to niech zacznie od nowa
  12. }
  13. }else {
  14. wyswietlanie formularza
  15. ?>


objaśnienie :

1) w Twoim kodzie wywoływałeś 3 razy połączenie z Bazą danych , w taki sposób robisz to tylko raz.Nie wiem czy masz autoloader więc jak to wywołać musisz sam już ogarnąć.Klasa baza którą traktowałeś jako singleton, jest dla mnie nie potrzebna. Stwórz sobie klasę tworzącą połączenie z twoimi danymi i dziedzicząca po PDO
2) zwracasz czy stan validacji , nie musisz potem sprawdzać czy zmienna uwagi jest pusta
3)Przedłużaj string na hasło, często ludzi wpisują bardzo popularne wyrazy, wystarczy wtedy md5 wkleić chociaż by w google i już się ma hasło.Przy przedłużeniu stringu jest to nie możliwe.Poza tym zwiększa bezpieczeństwo
4) wywołanie klasy krótsze, mniej if'ów, bardziej czytelne
5)mniejsza ilość zmiennych = mniej miejsca w pamięci

stosuj się do reguł
KISS - http://pl.wikipedia.org/wiki/Kiss
DRY - http://pl.wikipedia.org/wiki/DRY
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.