Najszybciej? Uzywaj frameworków z wbudowaną obsługą walidacji. Możesz też przeglądać klasy obsługi formularzy typu Formo w Kohanie. A możesz także wszystko zrzucić na swoją klasę. Ja to przykładowo robię podobnie nieco do Formo. Tworzę obiekt/tablicę, w którym przechowuję elementy formularza i dotyczy to także elementów walidacji. Przykład?
'label' => 'Email/login',
'value' => '',
'error' => '',
'type' => 'text',
'info' => 'Tutaj wpisz email, którego będziesz używał do logowania. Jest on także domyślnym kontaktowym do biura prasowego (może zostać zmieniony w wizytówce po zalogowaniu)',
'required' => true,
'filters' => array('strip_tags' => true, 'regexp' => '/[^a-z0-9$-_\.+!*\'(),{}|\\^~\[\]`<>#%";\/?:@&=]/i'), 'validators' => array( 'email' => true, 'exists_in_db' => array( 'field' => 'email', 'table' => 'auth_users') ) ),
'label' => 'Hasło',
'value' => '',
'error' => '',
'type' => 'password',
'info' => 'Hasło do logowania.',
'required' => true,
'filters' => array('strip_tags' => true), )
}
Zobacz sobie jak definiuję pola, co one zawierają. Potem już "tylko" w pętli każde pole podesłane POSTem sprawdzam. Jeśli jest 'required' => true, to musi być wypełnione, bo inaczej leci info do errors tego pola. Z filtrami i validatorami jest podobnie. Jeśli tablica ta coś zawiera dla danego pola... wykonuję to. Nie będę tu całego kodu wrzucał. To co interesuje Ciebie, mieści się pod fragmentem, który u mnie jest mniej więcej tutaj.
foreach( $register_form AS $k => $v ) {
if( $v['required'] && (!isset( $_POST[ $k ] ) || empty( $_POST[ $k ] ) ) ) { if( $register_form[$k]['type'] == 'checkbox' ) {
$register_form[$k]['value'] = true;
} else {
$register_form[$k]['value'] = false;
}
}
$register_form[$k]['error'] = 'Pole wymagane! Uzupełnij je.';
}
}
Wyświetlenie całości elementów to po prostu w takim układzie bajka

<?php foreach( $register_form AS $elem_n => $elem_v ) { ?>
<div
<?php echo ($elem_v['required'] ?
' class="required"' : ''); ?>>
<label for="
<?php echo $elem_n; ?>">
<?php echo $elem_v['label']; ?></label>
<?php
switch( $elem_v['type'] ) {
case 'text':
case 'submit':
?>
<?php
break;
case 'password':
?>
<input type="password" name="
<?php echo $elem_n ?>" value="" />
<?php
break;
case 'checkbox':
?>
<input type="checkbox" name="
<?php echo $elem_n; ?>"
<?php echo ($elem_v['value'] ?
' checked="checked"' : '' ) ?> />
<?php
break;
case 'select':
?>
<select name="
<?php echo $elem_n ?>">
<?php foreach( $elem_v['values'] AS $k => $v ) { ?>
<option value="
<?php echo $k; ?>"
<?php echo ( $elem_v['value'] == $k ?
' selected="selected"' : '' ); ?>>
<?php echo $v; ?></option>
<?php } ?>
</select>
<?php
break;
default:
}
?>
<p class="komunikat
<?php echo( !empty( $elem_v['error'] ) ?
'error' : 'info' ); ?>">
<?php echo( !empty( $elem_v['error'] ) ?
$elem_v['error'] : $elem_v['info'] ); ?></p>
</div>
<?php } ?>
EDIT: Jedynie nie robiłem w kodzie obsługi RADIO, bo nie używam niemal nigdy tej kontrolki (wolę SELECT). Ale mając to co dałem, dopisanie obsługi jest już dziecinnie proste. I nie dałem oczywiście tego jak waliduje czy filtruję dane. Jednak na podstawie kodu chyba nie jest potrzebne to... Łatwo wywnioskować co robię... Oczywiście chętni mogą zmodyfikować to pod obsługę multi-checkbox i multi-select do własnych potrzeb.
Byłbym zapomniał... Mam w kodzie kilka klas CSS, które określająpewne właściwości. required to oczywiście oznaczenie diva z polem jako wymagane (ja ustawiam kolor tła), a w dodatkowym akapicie, obok kontrolki, mam komunikat z systemu generowania, który pokazuje albo błąd pola w wyniku walidacji, albo informację o nim, czyli co to za pole i informacje co można tam dać itp.
Jako optymalizację można oczywiście "required" z osobnego pola przrzucić do "validation", ale to zależy od wygody

Całość jest zresztą prosta do modyfikacji i szczerze mówiąc to jest tylko kawałek szkieletu skryptu, który cały czas u mnie "mutuje". Tu dodam obsługę klas do pól w generowaniu kodu html, tutaj jakąś inna kontrolkę (właśnie dodaję textarea, którego braku nie zauważyłem

), tam nieco zmodyfikuję coś innego. Ostatecznie tak naprawdę to co dałem jest tylko szkicem większym, z którego nieco już kumający koderzy sobie i tak zrobia co chcą, obudują ładnie w klasy, dopiszą metody obiektowe i wstrzykną klasy filtrów oraz walidatorów, zamiast tak jak ja "na pałę"