Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: rejestracja, sprawdzenie
Forum PHP.pl > Forum > PHP
tukan
Witam,
Mam dla Was do sprawdzenia pocz±tek rejestracji. Nie ma tu jeszcze zapisu do bazy danych, ale mam gotow± walidację loginu i hasła. Został e-mail, ale to będzie analogicznie to loginu. Podaję kod:
  1. <?php
  2. function connect() {
  3. try {
  4. $host = "localhost";
  5. $dbname = "sfwyf";
  6. $user = "root";
  7. $pass = "vertrigo";
  8.  
  9. $dbh = new PDO("mysql:host=$host; dbname=$dbname", $user, $pass);
  10.  
  11. echo "Poł±czenie nawi±zane";
  12. return $dbh;
  13. } catch ( PDOException $error) { die("Failed to connect:" . $error->getMessage());
  14. }
  15.  
  16. }
  17.  
  18. function is_availble_login($dbh, $desired_login) // ta funkcja, bo jeszce będę wykorzystywał przy sprawdzaniu ajaxowym, to samo będzie dla meila
  19. {
  20. $dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  21. $sql = "SELECT * FROM users WHERE username =:username)";
  22. $q = $dbh->prepare($sql);
  23. try{ $count_row = $q->execute(array(':username'=>$desired_login));}
  24.  
  25. catch(PDOException $e) { print_r( "checking.... ".$e->getTrace() );}
  26. if ($count_row->fetchColumn() > 0) {
  27. return false;
  28. else return true;
  29. }
  30. }
  31. class r_User{
  32. public $id;
  33. public $pass;
  34. public $pass2;
  35. public $name;
  36. public $username;
  37. public $email;
  38. public $permission_level;
  39. public $validate = true;
  40. public $registration_error = array();
  41. public $registration_error_id = array();
  42. function valid_form{
  43. if(this->$pass==$this->pass2){
  44.  
  45. $this->pass = trim($this->pass);
  46. if( !preg_match('^(?:[0-9a-zA-Z±ćęłńó¶ĽżˇĆĘŁŃÓ¦¬Ż!@#$%^&*()_-=+[]{}|.]{5,15})$', $this->pass)
  47. {
  48. array_push($registration_error, "Podane hasło nie jest poprawne. Musi posiadać od 5 do 15 znaków. Hasło może zawierać następuj±ce znaki: cyfry; litery; oraz następuj±ce znaki: !@#$%^&*()_-=+[]{}|.")
  49. array_push($regisration_error_id, 0) // żebym wiedział, które pole na czerwono}
  50. $validate = false;
  51. }
  52.  
  53.  
  54. }
  55. else {array_push($registration_error, "Podane hasła nie zgadzaj± się");
  56. array_push($regisration_error_id, 0) // żebym wiedział, które pole na czerwono}
  57. $validate = false;
  58.  
  59. }
  60. //teraz login
  61.  
  62. $this->username = trim($this->username);
  63. if( !preg_match('^(?:[0-9a-zA-Z±ćęłńó¶ĽżˇĆĘŁŃÓ¦¬Ż._-!@#$&]{5,15})$', $this->username)
  64. {
  65. array_push($registration_error, "Podany login jest niepoprawnyasło nie jest poprawne. Musi posiadać od 5 do 15 znaków. Hasło może zawierać następuj±ce znaki: cyfry; litery; oraz następuj±ce znaki: ._-!@#$&")
  66. array_push($regisration_error_id, 1) // żebym wiedział, które pole na czerwono}
  67. $validate = false;
  68. }
  69. else{
  70. if(is_availble_login($dbh, $this->username))
  71. {
  72. //wpisuje do bazy
  73. }
  74. else{
  75. array_push($registration_error, "Ten login jest już zajęty");
  76. array_push($regisration_error_id, 1) // żebym wiedział, które pole na czerwono}
  77. $validate = false;
  78. }
  79.  
  80.  
  81. }
  82.  
  83.  
  84.  
  85. }
  86. else {array_push($registration_error, "Podane hasła nie zgadzaj± się");
  87. array_push($regisration_error_id, 0) // żebym wiedział, które pole na czerwono}
  88. $validate = false;
  89.  
  90. }
  91. }
  92.  
  93.  
  94.  
  95.  
  96. }
  97.  
  98.  
  99.  
  100. ?>

Możliwe, że gdzie¶ "ify" mog± zachodzić na siebie, ale to poprawię. Chodzi o koncepcje walidacji, jak j± poprawić/uoptymalnić?
Orzeszekk
Je¶li zerwiesz z syndromem - "Co nie ja napisałem, to niedobre" to możesz odkryć że ogólnodostępne frameworki PHP takie jak cakePHP lub Symfony 1/2 posiadaj± bardzo rozbudowane i wygodne walidatory.

Serio, szkoda sie bawic w wynajdowanie koła na nowo. Wbrew pozorom nie nauczysz się podczas tego zbyt dużo.

Ja my¶lę że walidacja jest paskudnie zrobiona. Wszystkie walidatory masz na stałe wpisane w metode validForm. Gdy przybędzie ci tego trochę, to kod wewnatrz tej metody rozrosnie sie na 30 ifów i case-ów. Trzeba robic rzeczy generycznie, tak by nie robic copy-paste jak bedziesz chcial to uzyc w innym miejscu.

Powiniene¶ utworzyć przynajmniej 2 klasy oparte na interfejsach podobnych do tych:

interface ValidatorEngine
{
function validateForm(Form $form);
function addValidator(Validator $validator);
}

interface Validator
{
function doValidate(ValidateFieldData $data);
}

w klase ValidateFieldData pakujesz wszystkie dane jakie musisz przeslac z formularza do walidatora, z metody doValidate zwracasz rezultat walidacji, dodajesz walidatory do validatorEngine i wstrzykujesz tam formularz.

Mozesz ten system pocisnac dalej i rozszerzyc interfejs Validator o metode w stylu getJavascript() która zwroci kod javascript potrzebny do przeprowadzenia danej walidacji rowniez po stronie klienta dla responsywnosci, i za pomoca validatorEngine uzbierany w tej sposob JS doklejac do widokow formularzy.

A wtedy ci wyjdzie system walidatorow jaki masz w symfony i wyjdzie na to ze nie warto bylo tego wszystkiego pisac, by sobie zwalidowac pare formularzy.
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.