Connect with us

Cześć, czego szukasz?

Internet Maker

Aplikacje internetowe – Obsługa formularzy

W jaki sposób stworzyć uniwersalny skrypt do wysyłania zawartości formularzy internetowych na stronie WWW. Formularze są podstawą działania wielu aplikacji internetowych. Pozwalają na łatwą komunikację pomiędzy użytkownikiem a skryptem działającym po stronie serwera.

Formularze są podstawą działania wielu
aplikacji internetowych. Pozwalają na łatwą
komunikację pomiędzy użytkownikiem
a skryptem działającym po stronie serwera.
Dzięki zastosowaniu języka HTML możliwe jest
stworzenie prostych pól umożliwiających pobranie
danych od użytkownika.

Problemy pojawiają się
jednak wtedy, gdy należy wysłać lub sprawdzić
dane zawarte w formularzu. W tym zakresie język
HTML nie oferuje zbyt dużej funkcjonalności i zmuszeni
jesteśmy użyć innej technologii (np. PHP)
działającej po stronie serwera.

Wyrażenia regularne

Wyrażenia regularne (ang. regular expressions) to
wzorce, które opisują łańcuchy symboli i znaków.
Wyrażenia regularne mogą określać zbiór pasujących
łańcuchów, mogą również wyszczególniać
istotne części łańcucha.

Celem tego artykułu jest zaprezentowanie
szybkiej i prostej metody automatyzacji obsługi
formularzy internetowych. Artykuł przedstawi krok
po kroku proces tworzenia skryptu umożliwiającego
wysłanie oraz weryfikację danych pochodzących
z dowolnego formularza internetowego.

Dzięki
zastosowaniu wyrażeń regularnych oraz ukrytych
pól konfiguracyjnych stworzymy uniwersalne rozwiązanie
pozwalające na łatwą i szybką implementację
na dowolnej stronie internetowej.

Projekt skryptu

Całość projektu została podzielona na trzy pliki.
Pierwszy to zwykły dokument HTML zawierający
formularz internetowy wraz z ukrytymi polami
umożliwiającymi ustawienie podstawowej konfiguracji skryptu. Drugi plik odpowiedzialny jest
za wygenerowanie i przesłanie zawartości pól do
użytkownika oraz administratora ankiety. Ostatni
moduł przeznaczony jest do sprawdzania poprawności
pól oraz wyświetlenia komunikatu błędu.

Podczas tworzenia skryptu szczególną uwagę
zwrócimy przede wszystkim na dwa ostatnie
moduły. Zostaną one zaprojektowane w ten sposób,
aby możliwe było podpięcie pod nie formularza bez
jakiejkolwiek zmiany kodu. W tym celu w formularzu
umieścimy pola typu \”hidden\”, aby przekazywać
przez nie dane dotyczące adresu e-mail odbiorcy
oraz tematu wiadomości. Dodatkowo zdefiniowane
zostanie także ukryte pole zawierające token
wymagany podczas procesu wysyłania formularza.

Dzięki takiemu rozwiązaniu unikniemy problemów
związanych ze spamowaniem skrzynki e-mail przez
roboty wykorzystujące niezabezpieczone formularze.

Walidacja pól formularza

Sprawdzanie poprawności tekstu wpisywanego
przez użytkowników jest jedną z istotnych czynności
powtarzanych podczas przetwarzania danych
z formularza. Istnieją dwie główny metody
walidacji pól formularzy. Jedna działa po stronie
serwera i wykorzystuje technologie typu PHP,
druga wykorzystuje przeglądarkę internetową oraz
język JavaScript.

Jak łatwo się domyślić każda z nich ma wady
i zalety. W tym artykule zastosujemy metodę
walidacji pól za pomocą języka PHP, wykorzystującą
wyrażenia regularne. W ten sposób kontrola
poprawności danych wejściowych przekazana
zostanie skryptom działającym po stronie serwera
WWW. Zaletą tego rozwiązania jest przede wszystkim
uniezależnienie skryptu od ustawień indywidualnych
użytkownika oraz sposobów implementacji
języka JavaScript w przeglądarkach internetowych.

Oprócz znajomości podstaw wyrażeń regularnych potrzebna jest również wiedza na temat ich
zastosowania w języku PHP. W naszym wypadku
wykorzystamy funkcję ereg dopasowującą dany
wzorzec do tekstu źródłowego. Składnia funkcji
jest następująca:

int ereg ( string $pattern, string
$string [, array &$regs] )

gdzie:

  • {stala}$pattern{/stala} – łańcuch znaków reprezentujący wzorzec
    wykorzystany podczas dopasowania tekstu,
  • {stala}$string{/stala} – tekst wejściowy zawierający wyszukiwane
    frazy,
  • {stala}$regs{/stala} – opcjonalne parametry – nie wykorzystywane
    w tym artykule.

W przypadku odnalezienia wzorca w tekście
źródłowym, funkcja zwróci wartość liczbową
równą liczbie znaków dopasowania. W przeciwnym
wypadku rezultatem wykonania funkcji będzie
FALSE.

Po poznaniu kilku podstawowych zagadnień
teoretycznych warto przejść do zastosowania tej
wiedzy w praktyce. Moduł walidacji, jaki stworzymy,
jest prostą funkcją przyjmującą za argument
nazwę pola, które zostanie poddane weryfikacji,
oraz wartość wpisaną przez użytkownika.
Pierwszym zadaniem funkcji jest rozpoznanie
typu pola na podstawie jego nazwy,
a następnie dopasowanie przypisanego mu
wzorca. W przypadku błędnej weryfikacji do
zmiennej $error dopisany zostaje łańcuch znaków
zawierający opis błędu.

Automatyczne przetwarzanie pól

Drugim etapem tworzenia skryptu automatyzującego
obsługę formularzy jest napisanie modułu
odpowiedzialnego za odebranie zawartości pól
oraz ich odpowiednie przetworzenie.

Cykl działania tej części skryptu jest następujący:

  • odebranie zawartości pól konfiguracyjnych
    przesłanych jako ukryte elementy formularza,
  • wykonanie pętli foreach dla wszystkich elementów
    wchodzących w skład formularza
    (na tym etapie następuje walidacja pól),
  • wyświetlenie błędów lub wysłanie zawartości
    formularza na adres e-mail podany w polach
    konfiguracyjnych.

Przed rozpoczęciem poznawania kodu tej części
skryptu, warto jest zapoznać się z kilkoma użytecznymi funkcjami. Pierwszą z nich jest {stala}ereg_replace{/stala},
służąca do podmiany wzorca na inny
zdefiniowany przez nas tekst. Wykorzystamy ją
do usunięcia znaków podkreślenia występujących
w nazwach pól.

Kolejną funkcją jest array_key_exists,
której użyjemy do sprawdzenia, czy w danej tablicy
asocjacyjnej znajdują się interesujące nas wpisy.
Ma to na celu zabezpieczenie skryptu przed próbami
dostępu bez użycia formularza.

Ostatnią i najważniejszą funkcją jest mail(),
której głównym zadaniem jest wysłanie wiadomości
e-mail pod wskazany adres. Warto zapoznać się
ze składnią funkcji, gdyż jest ona często stosowana
we wszelakich aplikacjach PHP.

Składnia:

mail($to, $subject, $msg, $ $mailheaders);

gdzie:

  • {stala}$to{/stala} – adres e-mail odbiorcy,
  • {stala}$subject{/stala} – temat e-maila,
  • {stala}$msg{/stala}- właściwa wiadomość,
  • {stala}$mailheaders{/stala} – nagłówki przesłane wraz
    z e-mailem.

Oto lista przykładowych nagłówków, jakie
można wykorzystać, przesyłając e-maila:

  • \”{stala}Reply-To: adres_email@serwer.pl{/stala}\” – adres
    e-mail nadawcy lub osoby do której zostanie
    wysłana odpowiedź,
  • \”{stala}From: Jakiś tekst lub e-mail{/stala}\” – pole wyświetlane
    jako \”Od\”, czyli tekst lub e-mail pojawiający
    się w nagłówku e-maila.

Posiadając już pewne podłoże teoretyczne,
warto przystąpić do tworzenia części kodu
PHP odpowiedzialnej za przetwarzanie pól
formularza.

Przykładowy formularz internetowy

W poprzednich dwóch sekcjach udało nam się
stworzyć najważniejszą część naszego skryptu.
Przyszedł jednak czas na przetestowanie jego funkcjonalności.
W tym celu stworzymy prostą ankietę
internetową umożliwiającą zademonstrowanie
procesu \”podpinania\” dowolnego formularza pod
skrypt.

Zakończenie

Na koniec pozostało już tylko przetestowanie
działania formularza oraz stworzenie własnej
ankiety wykorzystującej zaprezentowane rozwiązanie.
Jeżeli formularz zostanie zbudowany według
zaprezentowanych w tym artykule wytycznych,
wówczas nie będzie potrzeby modyfikowania
plików skryptu.

Jest to wygodne rozwiązanie dla
osób nielubiących przepisywania kodu za każdym
razem, gdy należy stworzyć nową ankietę.
Zaprezentowany w artykule zestaw reguł to
oczywiście tylko przykład. Zaawansowane ankiety
mogą wymagać bardziej skomplikowanej walidacji.
Po starannym przeanalizowaniu kodu, dodanie
nowych reguł nie powinno stanowić większego
problemu.

Przykład 1. form_func.php – krok po kroku

Krok 1. Deklaracja funkcji checkField.

Pierwszy argument funkcji checkField zawiera
wartość wpisaną do pola tekstowego,
natomiast drugi jest nazwą tego pola. Nazwa
pola używana jest do wyboru odpowiedniego
wzorca.


Krok 2. Rozpoznanie adresu e-mail

Rozpoznanie nazwy pola jako pola
zawierającego adres e-mail oraz próba
dopasowania wzorca odpowiedzialnego za jego
walidację. W przypadku błędu dopisywany jest
komunikat zawierający opis błędu.

if ( ereg(\'^[Ee][-]*mail$\', $field-Name ) ) {
if ( !ereg(\'^.+[@].+\.pl$\',
$string ) )
$error .= \"Adres e-mail niepoprawny:
$string \n\";

Krok 3. Rozpoznanie adresu URL

Próba rozpoznania nazwy pola jako adres
URL oraz walidacja jego zawartości. W tym
miejscu użyliśmy funkcji {stala}eregi{/stala}, która niczym nie
różni się od {stala}ereg{/stala} poza faktem, że jednakowo
traktuje wyrazy napisane różną wielkością liter.

} elseif ( eregi(\'^.*URL.*$\',
$fieldName ) ) {
if ( !ereg(\'^http://[A-Za-z]*\
..+$\', $string ) )
$error .= \"Podany adres nie jest poprawny: $string \n\";

Krok 4. Walidacja kodu pocztowego

Na tym etapie ma miejsce weryfikacja
kodu pocztowego (określonego wzorcem
XX-XXX, gdzie X jest cyfrą)

} elseif ( ereg(\'^[Kk]od [Pp]ocztowy$\',
$fieldName ) ) {
if ( !ereg(\'^[0-9][0-9]-[0-9][0-9][0-9]$\', $string ) )
$error .= \"Kod pocztowy nie jest poprawny: $string \n\";

Krok 5. Zignorowanie pół nieobowiązkowych

Pominięcie walidacji pól zawierających
w nazwie słowo \"opcjonalne\". W ten
sposób istnieje możliwość określenia pól, których
wypełnienie nie jest obowiązkowe.

} elseif ( ereg(\'^.*opcjonalne$\', $fieldName ) ) {$error .= \"\";

Krok 6. Zablokowanie wysyłki pustych pól

W przypadku braku możliwości rozpoznania
nazwy pola, użyj domyślnej reguły
która uniemożliwia przesłanie pustego pola.

} else {
if ( ereg(\'^[ ]*$\', $string ) )
$error .= \"Pole: $fieldName nie moze byc puste \n\";
}

Krok 7. Zwrócenie zawartości zmiennej $error.

W sytuacji, gdy walidacja została zakończona
sukcesem zmienna nie zawiera żadnego
ciągu znaków. W przeciwnym wypadku znaleźć
w niej można listę napotkanych błędów.

return $error;
}
?>

Przykład 2. mail_processing.php - krok po kroku

Krok 1. Sprawdzenie, czy skrypt został uruchomiony za pośrednictwem formularza

Próba odczytu wartości konfiguracyjnych (adres e-mail odbiorcy oraz
temat wiadomości) przesłanych z ukrytych pól formularza. Wyświetlenie
strony z błędem w przypadku nieodpowiedniego uruchomienia skryptu.


Krok 2. Implementacja zabezpieczenia antyspamowego

Walidacja poprawności tokena przesłanego razem z formularzem oraz
wyświetlenie komunikatu w przypadku błędu.

if ( array_key_exists( \"kod\", $_POST ) ) {
$kod = $_POST[\"kod\"];
if ( ! ( trim($kod) == $_POST[\"kod_odp\"] ) ) {
$errors .= \"Wpisano błędny token.\n\";
}
} else {
$errors .= \"Błędny token.\n\";
}

Krok 3. Przetworzenie formularza przy użyciu tablicy asocjacyjnej

Użyjemy tablicy ($_REQUEST) zawierającej zawartość przesłanych
pól. Pominięcie ukrytych pól konfiguracyjnych oraz walidacja
poprawności pozostałych pól. Na tym etapie następuje wygenerowanie treści
wiadomości e-mail oraz komunikatów wyświetlanych po stronie przeglądarki
internetowej.

foreach ( $_REQUEST as $field => $value )
{
if ( $field != \"subject\" && $field !=\"mailto\" &&
$field !=\"kod\" && $field != \"kod_odp\" )
{
$field = ereg_replace(\"_\", \" \", $field );
// replace _ with spaces
$errors .= checkFields( $value, $field
);
$mail_msg .= \"$field : $value \n\";
$textHTML .= \" $field  :  
$value 
\"; } }

Krok 4. Wyświetlenie potwierdzenia oraz wysłanie wiadomości e-mail

Stanie się tak w przypadku braku stwierdzenia błędów. Na tym etapie
usuwamy również znacznik \"{stala}_usunto_{/stala}\" z adresu e-mail przekazanego
w ukrytym polu formularza. Jest to zabezpieczenie uniemożliwiające przechwycenie
naszego adresu e-mail przez boty skanujące sieć.

if ( strlen( trim($errors) ) == 0 )
{
// HTML
$title = \"Formularz został wysłany\";
$opis = \"Dane zostały przesłane do redakcji 
Dziękujemy!
\"; $textHTML .= \"

strona glówna \"; // Usun \"_usunto_\" z adresu e-mail $mailto = ereg_replace(\"_usunto_\", \"\", $mailto ); // MAIL $mail_msg .= \"\n\n\"; $mailheaders = \"From: $mailto \n\"; @mail( $mailto , $subject, $mail_msg, $mailheaders); } else { //HTML $title = \"Formularz nie został wysłany!\"; $opis = \"Niestety formularz został blednie wypełniony.
Wróć i popraw poniższe błędy:\"; $textHTML = \"\" .nl2br($errors) . \"\" . \"

wróc i popraw\"; }

Krok 5. Wygenerowanie kodu HTML wyświetlającego stronę

Strona będzie zawierać podsumowanie lub ewentualnie opisy błędów.

echo \"




 Przykładowa Ankieta - $title 


$title

$opis

$textHTML

\"; ?>

Przyklad 3. form.html - krok po kroku

Krok 1. Deklaracja nagłówka oraz struktury dokumentu HTML

Na początku strony należy zamieścić nagłówek zawierający niezbędne
deklaracje.





 Przykładowa Ankieta 

Krok 2. Utworzenie formularza wysyłającego zawartość pól

Użyjemy do tego metody POST. Warto zwrócić uwagę, że formularz
musi zostać przetworzony przez skrypt znajdujący się w pliku {stala}mail_processing.php{/stala}.

Krok 3. Zadeklarowanie trzech pól ukrytych

Stanowią one konfigurację dla naszego skryptu. Pierwsze pole definiuje
tytuł przesłanej wiadomości, natomiast drugie adres na który zostanie
ona wysłana. Warto zauważyć, że adres e-mail składa się również z przyrostka
\"{stala}_usunto_{/stala}\".

Ma to na celu zabezpieczenie formularza przed botami
skanującymi sieć. Podczas etapu wysyłania zawartości formularza przyrostek
zostanie automatycznie usunięty z adresu. Ostatnie pole to odpowiedź na
pytanie zadane przez zabezpieczenie antyspamowe (uwaga: wielkość liter
ma znaczenie).



Krok 4. Stworzenie pól formularza

Na tym etapie następuje stworzenie właściwych pól formularza,
których zawartość zostanie przesłana na wskazany przez nas adres
e-mail. Warto dodać, że w nazwach formularzy zamiast spacji należy używać
podkreślenia, które na etapie przetwarzania zostaną automatycznie zamienione
na spacje.

Jeżeli z pewnych powodów chcemy zaznaczyć, że dane pole nie musi zostać
wypełnione, wtedy do jego nazwy dodajemy słowo \"opcjonalne\".

Krok 5. Dodanie pola o nazwie \"kod\"

W to pole użytkownik będzie musiał wpisać wygenerowany kod, stanowiący
zabezpieczenie antyspamowe. Jest to dosyć duże utrudnienie dla
wszelkich robotów, które w większości przypadków nie potrafią go obejść.

Krok 6. Dodanie przycisku \"Submit\"

Na koniec pozostało już tylko zamieszczenie przycisku wysyłającego
formularz oraz zamknięcie wszystkich niezakończonych tagów.

Zgłoszenie strony miesiąca

 
Nazwa strony:
Adres URL:
Kod Pocztowy:
Proponowany opis
Dodatkowy komentarz:
Adres e-mail:
Numer telefonu:
Zabezpieczenie antyspamowe: Proszę odpowiedzieć na pytanie \"Jak na imię ma Małysz\":

Może cię też zainteresować

Internet Maker

Zbieranie informacji zwrotnych (ang. feedback) od użytkowników serwisu może mieć duże znaczenie dla rozwoju twojego serwisu. Dlatego warto poznać kilka narzędzi, które na różne sposoby umożliwiają zbieranie...

Internet Maker

Formularz w serwisie internetowym może być miejscem budującym w użytkownikach frustrację lub sprzyjającym zwiększeniu ich satysfakcji. Dlatego uczynienie formularzy bardziej użytecznymi może mieć duże znaczenie dla...

Internet Maker

Potrafimy już stworzyć licznik znaków wpisanych do określonych pól formularza. Teraz trochę poeksperymentujemy, dodając funkcjonalność podobną np. do serwisu SMS Orange (http://sms.orange.pl). Chodzi o limit znaków w elementach textarea.

Internet Maker

Tym razem pokażemy, jak dynamicznie dodawać nowe elementy do formularza. Ze znajomością kilku funkcji okaże się to łatwe i szybkie.