Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Problemy z walidacją OOP
Panicz74
post
Post #1





Grupa: Zarejestrowani
Postów: 39
Pomógł: 1
Dołączył: 28.08.2015

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


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. ?>
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 9)
Tomplus
post
Post #2





Grupa: Zarejestrowani
Postów: 1 879
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


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.
Go to the top of the page
+Quote Post
session
post
Post #3





Grupa: Zarejestrowani
Postów: 112
Pomógł: 22
Dołączył: 11.04.2010
Skąd: Tarnów

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


  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.

Ten post edytował session 11.02.2016, 21:53:44
Go to the top of the page
+Quote Post
Riggs
post
Post #4





Grupa: Zarejestrowani
Postów: 162
Pomógł: 13
Dołączył: 16.06.2007

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


Dokładnie tak jak pisze @session, przez ten return waliduje się tylko pierwsze pole.
Go to the top of the page
+Quote Post
JakubBab
post
Post #5





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


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?

Ten post edytował JakubBab 20.02.2016, 14:48:43
Go to the top of the page
+Quote Post
com
post
Post #6





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


@up co masz na myśli?
Go to the top of the page
+Quote Post
JakubBab
post
Post #7





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


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.


Go to the top of the page
+Quote Post
com
post
Post #8





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


ok, no to jest źle napisane to fakt smile.gif
Go to the top of the page
+Quote Post
JakubBab
post
Post #9





Grupa: Zarejestrowani
Postów: 96
Pomógł: 2
Dołączył: 13.07.2015

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


ph34r.gif
Go to the top of the page
+Quote Post
com
post
Post #10





Grupa: Zarejestrowani
Postów: 3 034
Pomógł: 366
Dołączył: 24.05.2012

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


bledna przeróbka tego https://www.youtube.com/playlist?list=PLfdt...CE9mxspdpX_JleP wink.gif
Go to the top of the page
+Quote Post

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: 20.08.2025 - 11:42