Clicky

Skocz do zawartości


Zdjęcie
- - - - -

[K3] Formularz - kontrola danych

1 odpowiedź w tym temacie

  • Zaloguj się, aby dodać odpowiedź

#1 dimek

dimek

    Początkujący

  • Użytkownik
  • Pip
  • 66 postów

Napisano 30 kwiecień 2011 - 16:39

Cześć,

podczas pracy nad moim pierwszym projektem w Kohana, zacząłem się zastanawiać nad pewną kwestią. Otóż, mamy w formularzu pewną listę, dla przykładu:

<form method="post">
<label for id="name">Imię:</label>
<input type="text" name="uname" id="name" maxlength="30" />
<label for id="list">Ulubiony kolor?</label>
<select name="list" id="list">
  <option value="0">Brak</option>
  <option value="1">Czerwony</option>
  <option value="2">Zielony</option>
  <option value="3">Niebieski</option>
</select>
<input type="submit" name="submit" value="Wyślij" />
</form>

Powyższy przykład sugeruje, że użytkownik ma tylko cztery opcje wyboru.

W tabeli "users" znajdują się trzy pola:

- id int(11) (AI)
- username varchar(30)
- favourite_color tinyint(1)

Gdy użytkownik wypełni formularz bez kombinowania - wszystko powinno być w porządku. Dodam jeszcze, że w tym przypadku walidacji podlega jedynie input odpowiedzialny za imię. A co w sytuacji, gdy ktoś po prostu zmieni sobie wartość danej opcji w liście np. na "6" i doda atrybut "selected" (chociażby za pomocą Web Developer Tool)? Do tabeli zostanie dodany rekord z nieodpowiednią wartością. Podczas gdy będziemy odczytywać dane skorzystamy z wcześniej zdefiniowanej tablicy, by dowiedzieć się jaki kolor wybrała dana osoba.


$colors = array(
            0 => 'Brak',
            1 => 'Czerwony',
            2 => 'Zielony',
            3 => 'Niebieski',
);

echo $color[$user->favourite_color]; //$user->favourite_color przechowuje wartość równą 6, a takiego klucza nie ma w tablicy, czyli będzie zonk

//inny sposób

switch($user->favourite_color) {

  case 1:
  echo 'Czerwony';
  break;

 case 2:
 echo 'Zielony';
 break;

 case 3:
 echo 'Niebieski';
 break;

 default:
 echo 'Brak';
 break;

}

//^ wszystko się zgadza, tylko tracimy na kontroli tych danych (użytkownikowi udało się zapisać nie zdefiniowaną wartość w bazie) i musimy to obejść w dość prymitywny sposób.


Przetrzymywanie tych danych (w bazie) w postaci tekstowej wydaje mi się mało efektywne. Nawet wtedy użytkownik będzie mógł zmanipulować te dane tak, by zapisać i uzyskać oczekiwaną wartość (wcześniej przez niego podaną). Plusem takiego zabiegu może być to, że można te dane od razu wyświetlić, bez potrzeby tworzenia żadnych tablic.

W przypadku danych liczbowych - zamiast tablic czy instrukcji warunkowych, można to zrobić na bazie. Dla przykładu - możemy utworzyć tabelę colors z dwoma polami:

- color_id tinyid(1)
- color_name varchar(30)

No i oczywiście zrobić to na zasadzie relacji.

Jeżeli taka lista będzie ograniczać się do wyboru dwóch opcji (Tak/Nie), to można te dane później sprawdzić warunkiem:


<form method="post">
<label for id="list">Lubisz placki?</label>
<select name="list" id="list">
  <option value="0">Nie</option>
  <option value="1">Tak</option>
</select>
<input type="submit" name="submit" value="Wyślij" />
</form>


$list = ($_POST['list'] == 0)? 0 : 1; //wtedy gdy ktoś będzie próbował namieszać i podać większą wartość niż maksymalna (1), to tak czy siak zawiedzie


Przyszła mi do głowy jeszcze jedna rzecz. Może się zdarzyć tak, że będziemy musieli dynamicznie generować takie listy - wypełniając je danymi z bazy. W takim przypadku powyższe metody już zawiodą. Wtedy jednak będzie trzeba dodać nową regułę, która będzie odwoływać się do konkretnej metody (sprawdzającej czy faktycznie takie ID istnieje w odpowiedniej tabeli).


Formularze nigdy nie były moją mocną stroną, choć stosowałem je już wiele razy.

Mam nadzieję, że zbytnio nie pogmatwałem (chyba aż za bardzo) :P Jak to u Was wygląda? Jak sobie radzicie z takimi problemami (na pozór banalnymi?)?

P.S: Nie korzystam z żadnego modułu do formularzy, a może powinienem zacząć?


#2 JoShiMa

JoShiMa

    Młodszy Mastah

  • Użytkownik
  • PipPip
  • 366 postów

Napisano 30 kwiecień 2011 - 17:11

Do rozwiązywania takich dylematów można zaprząc choćby moduł formo z całą serią gotowych reguł walidacji oraz możliwością definiowania własnych za pomocą funkcji callback.

Definiujesz sobie wszystkie elementy formularza, do każdego definiujesz zestaw reguł na podstawie parametrów wpisanych z palca albo pobranych z bazy i nie martwisz się, bo jak ktoś wpisze źle, to nie przejdzie walidacji i już.




Użytkownicy przeglądający ten temat: 0

0 użytkowników, 0 gości, 0 anonimowych