Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Problemy z walidacją OOP
Forum PHP.pl > Forum > PHP
Panicz74
Witam,

Mam problem z formularzem rejestracji. Walidacja działa jedynie w przypadku pola 'username', w pozostałych przypadkach niestety nie. Zupełnie nie mam pojęcia gdzie może być błąd. Może wy coś doradzicie?

register.php
  1. <?php
  2.  
  3. require_once 'core/init.php';
  4.  
  5. if(Input::exists())
  6. {
  7. $validate = new Validate();
  8. $validation = $validate->check($_POST, array(
  9. 'username' => array(
  10. 'required' => true,
  11. 'min' => 2,
  12. 'max' => 20,
  13. 'unique' => 'users'
  14. ),
  15. 'password' => array(
  16. 'required' => true,
  17. 'min' => 6,
  18. ),
  19. 'password_again' => array(
  20. 'required' => true,
  21. 'matches' => 'password'
  22. ),
  23. 'name' => array(
  24. 'required' => true,
  25. 'min' => 2,
  26. 'max' => 20
  27. ),
  28. ));
  29.  
  30. if($validation->passed())
  31. {
  32. echo "Registered";
  33. }
  34. else
  35. {
  36. print_r($validation->errors());
  37. }
  38. }
  39.  
  40. ?>


validate.php
  1. <?php
  2. class Validate
  3. {
  4. private $_passed = false;
  5. private $_errors = array();
  6. private $_db = null;
  7.  
  8. public function __construct()
  9. {
  10. $this->_db = DB::getInstance();
  11. }
  12.  
  13. public function check($source, $items = array())
  14. {
  15. foreach($items as $item => $rules)
  16. {
  17. foreach($rules as $rule => $rule_value)
  18. {
  19. $value = $source[$item];
  20.  
  21. if($rule === 'required' && empty($value))
  22. {
  23. $this->addError("{$item} is required");
  24. }
  25. else
  26. {
  27. $this->_passed = true;
  28. }
  29. return $this;
  30. }
  31. }
  32. if(empty($this->_errors))
  33. {
  34. $this->_passed = true;
  35. }
  36. //return $this;
  37. }
  38.  
  39. private function addError($error)
  40. {
  41. $this->_errors[] = $error;
  42. }
  43.  
  44. public function errors()
  45. {
  46. return $this->_errors;
  47. }
  48.  
  49. public function passed()
  50. {
  51. return $this->_passed;
  52. }
  53. }
  54. ?>
Tomplus
Na moje oko działa ci to "dobrze", bo jak działa w przypadku username, to jeżeli będziesz miał usera złego, a hasło dobre, to będzie ci działać dobrze dla hasła.
Czyli dla każdego poprawnego pola będziesz miał $this->_passed = true; i if($validation->passed()) także będzie spełnione.
session
  1. foreach($rules as $rule => $rule_value)
  2. {
  3. $value = $source[$item];
  4.  
  5. if($rule === 'required' && empty($value))
  6. {
  7. $this->addError("{$item} is required");
  8. }
  9. else
  10. {
  11. $this->_passed = true;
  12. }
  13. return $this;
  14. }


Na końcu tej pętli masz return co skutkuje tym, że wykona się tylko 1 raz (czyli dla username w tym przypadku) i zakończy działanie niezależnie od wyniku walidacji. Co więcej użycie w else{ $this->_passed = true; } powoduje, że wystarczy, że jeśli tylko jedno będzie poprawne, a pozostałe złe to i tak wynik będzie true, $this odwołuje się do całego obiektu, a nie pojedynczych wartości. No i na dodatek if($rule === 'required' && empty($value)) sprawdzasz tylko czy w tablicy jest element "required", a nie sprawdzasz, czy ma wartość true czy false.

Wywal to else, a return daj tam gdzie masz zakomentowany.
Riggs
Dokładnie tak jak pisze @session, przez ten return waliduje się tylko pierwsze pole.
JakubBab
Pytanie do Twojego kodu :

Linijka:
  1. foreach($rules as $rule => $rule_value)
  2. {
  3. $value = $source[$item];
  4.  
  5. if($rule === 'required' && empty($value))
  6. {
  7. $this->addError("{$item} is required");
  8. }
  9. ..............bla bla bla


  1. foreach($rules as $rule => $rule_value)
  2. {
  3. $value = $source[$item];


Powieli tablice zgodnie z liczba iteracji (3 lub 4 w tym przypadku). Czy tak mialo byc i czy to jest dobra praktyka? Nie zabiera to (zbednie) pamieci przez iterowanie 3 or 4 razy tego samego?
com
@up co masz na myśli?
JakubBab
tablica
  1.  
  2. foreach($rules as $rule => $rule_value)
  3. {
  4. $value = $source[$item];


tablica $value w tej petli to:
  1. (
  2. [required] => 1
  3. [min] => 2
  4. [max] => 20
  5. [unique] => users
  6. )
  7. (
  8. [required] => 1
  9. [min] => 2
  10. [max] => 20
  11. [unique] => users
  12. )
  13. (
  14. [required] => 1
  15. [min] => 2
  16. [max] => 20
  17. [unique] => users
  18. )
  19. (
  20. [required] => 1
  21. [min] => 2
  22. [max] => 20
  23. [unique] => users
  24. )
  25. (
  26. [required] => 1
  27. [min] => 6
  28. )
  29. (
  30. [required] => 1
  31. [min] => 6
  32. )
  33. (
  34. [required] => 1
  35. [matches] => password
  36. )
  37. (
  38. [required] => 1
  39. [matches] => password
  40. )
  41. (
  42. [required] => 1
  43. [min] => 2
  44. [max] => 20
  45. )
  46. (
  47. [required] => 1
  48. [min] => 2
  49. [max] => 20
  50. )
  51. (
  52. [required] => 1
  53. [min] => 2
  54. [max] => 20
  55. )


Jest powielona.


com
ok, no to jest źle napisane to fakt smile.gif
JakubBab
ph34r.gif
com
bledna przeróbka tego https://www.youtube.com/playlist?list=PLfdt...CE9mxspdpX_JleP wink.gif
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.