Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: walidacja danych na podstawie warunku z tablicy
Forum PHP.pl > Forum > PHP
ktuvok
Załóżmy, że jest taka tablica:

  1. <?php
  2.  
  3. $Tablica = array(
  4. '$Zmienna1' => ('$Zmienna1 > 45','Nieprawidłowa wartość!'),
  5. '$Zmienna3' => ('$Zmienna3 != 2005','Nieprawidłowy rok!')
  6. );
  7.  
  8. ?>


Chciałbym napisać pętlę, która dla każdej zmiennej przesłanej POST-em dokona sprawdzenia warunku, zawartego w tablicy i zwróci błąd w przypadku jego nie spełnienia. Zacząłem tak:
  1. <?php
  2.  
  3. foreach($_POST as $k=>$v)
  4. {
  5. if(array_key_exists($k, $_POST))
  6. {
  7. $Warunek = $Tablica[$k][0];
  8. if(eval($Warunek))
  9. {
  10. echo "Dla $k warunek $Warunek spełniony<BR>";
  11. }
  12. else
  13. {
  14. echo "Dla $k warunek $Warunek nie spełniony!<BR>";
  15. }
  16. }
  17. }
  18.  
  19. ?>


ale nie bardzo chce to działać... Proszę o wskazówki, jak to poprawnie napisać.

Pozdrawiam,
K
crash
  1. <?php
  2. $Tablica = array(
  3. '$Zmienna1' => array('$Zmienna1 > 45','Nieprawidłowa wartość!'),
  4. '$Zmienna3' => array('$Zmienna3 != 2005','Nieprawidłowy rok!')
  5. );
  6. ?>

Jaki sens ma if(array_key_exists($k, $_POST)) w pętli foreach? Przecież to jest zawsze spełnione biggrin.gif
ktuvok
Cytat
Jaki sens ma if(array_key_exists($k, $_POST)) w pętli foreach? Przecież to jest zawsze spełnione  biggrin.gif


Faktycznie, powinno być tak:
  1. <?php
  2.  
  3. if(array_key_exists($k, $Tablica))
  4.  
  5. ?>


Co nie zmienia faktu, że i tak mi to nie działa jak trzeba... sad.gif
serafin
Ja bym to zrobil inaczej :]

  1. <?
  2. $conditions = array(
  3. );
  4.  
  5. $conditions['title'][] = 'length>1000';
  6. $conditions['title'][] = 'type:string';
  7. $conditions['title'][] = 'values:test:test:test';
  8.  
  9. $error = false;
  10.  
  11. foreach($_POST as $key => $val) {
  12. if(array_key_exists($key, $conditions)) {
  13.  foreach($conditions[$key] as $condition) {
  14.  preg_match('@^(length|values|type)?(:><=)?(.*?)@is', $condition, $subcondition);
  15.  
  16. switch($subcondition[1]) {
  17. case 'length':
  18. switch($subcondition[2]) {
  19. case '>':
  20. $error = !(strlen($val) > $subcondition[3]);
  21. break;
  22.  
  23. case '<':
  24. $error = !(strlen($val) < $subcondition[3]);
  25. break;
  26.  
  27. case '=':
  28. $error = !(strlen($val) = $subcondition[3]);
  29. break;
  30. }
  31. break;
  32.  
  33. case 'type':
  34. switch($subcondition[3]) {
  35. case 'string':
  36. $error = !(strlen(strval($val)) == strlen($val));
  37. break;
  38.  
  39. case 'int':
  40. $error = (intval($val) == 0);
  41. break;
  42. }
  43. break;
  44.  
  45. case 'values':
  46. $error = !in_array($val, explode($subcondition[3]));
  47. break;
  48.  
  49. }
  50.  
  51.  }
  52. }
  53. }
  54.  
  55. ?>


Ale ze jestem chory to pisze z palca i nie testuje winksmiley.jpg Wskazowka jakas jest tongue.gif
ktuvok
No jest to jakiś pomysł, tyle że ja muszę mieć czasem nieco bardziej skomplikowane warunki. Przykładowo, numer NIP musi być zwalidowany funkcją:
  1. <?php
  2.  
  3. $Tablica = array(
  4. '$Zmienna1' => ('$Zmienna1 > 45','Nieprawidłowa wartość!'),
  5. '$Zmienna3' => ('$Zmienna3 != 2005','Nieprawidłowy rok!'),
  6. '$Nip' => ('ZweryfikujNip($Nip) == true','Nieprawidłowy NIP.')
  7. );
  8.  
  9. ?>

Dlatego najłatwiej byłoby mi wpisać do tablicy cały warunek. Problem sprowadza się jedynie do tego, jak string wyciągnięty z tablicy potraktować jako kod php.

Pozdrawiam,
K
crash
Kurde napisałem Ci co masz źle a ty dalej swoje:
ŹLE:
  1. <?php
  2. $Tablica = array(
  3. '$Zmienna1' => ('$Zmienna1 > 45','Nieprawidłowa wartość!'),
  4. '$Zmienna3' => ('$Zmienna3 != 2005','Nieprawidłowy rok!'),
  5. '$Nip' => ('ZweryfikujNip($Nip) == true','Nieprawidłowy NIP.')
  6. );
  7. ?>

DOBRZE:
  1. <?php
  2. $Tablica = array(
  3. '$Zmienna1' => array('$Zmienna1 > 45','Nieprawidłowa wartość!'),
  4. '$Zmienna3' => array('$Zmienna3 != 2005','Nieprawidłowy rok!'),
  5. '$Nip' => array('ZweryfikujNip($Nip) == true','Nieprawidłowy NIP.')
  6. );
  7. ?>

Ale i tak nawet nie używasz $Tablica[$X][1]...
ktuvok
Nie zrozumieliśmy się... Problem nie polega na konstrukcji tablicy, tylko na tym, jak potraktować string w niej zapisany jako wyrażenie, zwracające true albo false.

Dla pewności załączam raz jeszcze cały skrypt:
  1. <?php
  2.  
  3. $Tablica = array(
  4. 'Zmienna1' => array(10,'',''),
  5. 'Zmienna2' => array(10,'$Zmienna2>10','Błąd w wierszu 2')
  6. );
  7.  
  8. if(isset($_POST['submit']))
  9. {
  10. foreach($_POST as $k=>$v)
  11. {
  12. if(array_key_exists($k, $Tablica))
  13. {
  14. $Warunek = $Tablica[$k][1];
  15. if($Warunek != '')
  16. {
  17. if(eval("$Warunek"))
  18. {
  19. echo "Dla $k warunek $Warunek spełniony<BR>";
  20. }
  21. else
  22. {
  23. echo "Dla $k warunek $Warunek nie spełniony<BR>";
  24. }
  25. }
  26. }
  27. }
  28. }
  29.  
  30. ?>

każdorazowo otrzymuję komunikat:
Cytat
Parse error: parse error, unexpected $ in [tu ścieżka do skryptu](24) : eval()'d code on line 1

no i oczywiście false jako rezultat walidacji za każdym razem...

Co robię źle?

Pozdrawiam,
k
ActivePlayer
  1. <?php
  2. if(eval("$Warunek"))
  3. ?>

po co chwytasz $Warunek w podwojne ciapki ? wez je wywal... watpie ze to problem rozwiąże ale spróbuj... btw... Twoje warunki powinny wygladać tak:
  1. <?php
  2. $warunek = 'echo ($Zmienna1 > 45);';
  3. ?>

wtedy eval($warunek) cos zwróci.. albo sie myle ?
ktuvok
A po co "echo" ? Problem polega tylko na tym, że nie wiem jak potraktować string parserem php, tak aby zwrócone zostało true albo false.

Pozdrawiam,
K
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.