Prosty formularz kontaktowy w PHP

Data aktualizacji: 22.04.2024r. Autor: Bartosz Stefanicki.

Prosty formularz kontaktowy w PHP

Dzięki formularzowi wysłanie wiadomości będzie dla klienta szybsze, a strona w odbiorze bardziej profesjonalna.

Pierwsza wersja tej porady została opublikowana 18 maja 2010 roku. Poniższy artykuł został zaktualizowany.

1. Tworzymy plik

Na początek tworzymy plik o nazwie kontakt.php. Po wrzuceniu go na serwer będzie dostępny pod adresem np. www.nazwa-strony.pl/kontakt.php. Pierwszy będzie szkic, a więc podstawowe tagi z języka HTML.

<html lang="pl">
<head>
    <title>Formularz kontaktowy</title>
    <!-- CSS Bootstrapa -->
</head>
<body>

</body>
</html>

Formularz będzie wykorzystywał style Bootstrapa (getbootstrap.com). Wyżej zdefiniowaliśmy dokument HTML z tytułem "Formularz kontaktowy".

2. Dodajemy kod PHP

Na początku BODY wkleimy kod PHP, który obsłuży walidację otrzymanych danych i wysłanie formularza na wskazany przez nas adres e-mail.

<?php
$errorMessage = null;
$successMessage = null;

if ($_POST) {
    $name = isset($_POST['name']) ? filter_var($_POST['name'], FILTER_SANITIZE_STRING) : null;
    $email = isset($_POST['email']) ? filter_var($_POST['email'], FILTER_VALIDATE_EMAIL) : null;
    $message = htmlspecialchars($_POST['message']);

    if (empty($name) || empty($email) || empty($message)) {
        $errorMessage = 'Wypełnij wszystkie pola!';
    }

    if (is_null($errorMessage)) {
        mail(
            'twoj-adres@email.pl',
            'Formularz kontaktowy',
            "Treść wiadomości: $message \n\n Imię: $name \n\n Adres e-mail: $email",
            "From: $name <$email>"
        );

        $successMessage = 'Wiadomość została wysłana';
    }
}
?>

Definiujemy dwie zmienne $errorMessage i $successMessage, do których będziemy przypisywać komunikaty o błędach i sukcesie. Następnie warunek if ($_POST) sprawia, że kod w jego ramach wykona się tylko podczas akcji POST (czyli po wysłaniu formularza przez klienta).

Formularz kontaktowy będzie zawierał trzy pola do wypełnienia: Imię, Adres e-mail i Treść wiadomości. Dlatego definiujemy trzy zmienne $name, $email i $message. Każda z nich odbiera dane z formularza i je waliduje.

Jeśli któreś z pól formularza jest puste (warunki z empty()), to zwrócimy komunikat z błędem "Wypełnij wszystkie pola!".

Jeśli wszystkie pola są wypełnione, to korzystamy z funkcji PHPowej mail().

Pierwszy argument to adres e-mail, na który formularz kontaktowy zostanie wysłany. Drugi to tytuł wiadomości jaki otrzymamy. Trzeci argument to treść wiadomości, czyli wklejamy do niej pola z formularza klienta. Ostatni argument to nagłówek From, czyli podstawiamy Imię klienta i jego adres e-mail (po otrzymaniu wiadomości będziemy mogli wówczas bezpośrednio klientowi odpisać).

Na koniec zwracamy komunikat w zmiennej $successMessage o tym, że wiadomość została wysłana.

3. Kod HTML

Pozostał już tylko kod HTML, który odpowiada za wyświetlenie formularza. Pod kodem jego wyjaśnienie.

<div class="container">
    <div class="row">
        <div class="col col-md-6 offset-md-3">

            <h3 class="my-5">Formularz kontaktowy</h3>

            <?php if ($errorMessage) : ?>
                <div class="alert alert-danger"><?php echo $errorMessage; ?></div>
            <?php endif; ?>

            <?php if ($successMessage) : ?>
                <div class="alert alert-success"><?php echo $successMessage; ?></div>
            <?php endif; ?>

            <form method="POST">
                <div class="mb-3">
                    <label for="name" class="form-label">Imię</label>
                    <input type="text" class="form-control" id="name" name="name">
                </div>

                <div class="mb-3">
                    <label for="email" class="form-label">Adres e-mail</label>
                    <input type="email" class="form-control" id="email" name="email">
                </div>

                <div class="mb-3">
                    <label for="message" class="form-label">Treść wiadomości</label>
                    <textarea class="form-control" id="message" name="message" rows="3"></textarea>
                </div>

                <div class="mb-3">
                    <input class="btn btn-primary" type="submit" value="Wyślij formularz">
                </div>
            </form>

        </div>
    </div>
</div>

Na początku korzystamy z Bootstrapowych klas, dzięki którym formularz kontaktowy będzie wyświetlony na środku strony, będzie zawierał odstępy etc.

Dzięki sprawdzamy czy zmienna z PHP $errorMessage nie jest pusta. Jeśli zawiera wiadomość to wyświetlamy alert z klasą alert-danger, dzięki czemu komunikat będzie w kolorze czerwonym.

Analogicznie z $successMessage. Jeśli będzie zdefiniowany komunikat o powodzeniu, to wyświetlamy komunikat w kolorze zielonym.

Następnie dodajemy ramę formularza i jego kolejne pola: name, email i message. Na końcu znajduje się przycisk do wysłania formularza.

Zobacz także

79 komentarzy

Bartosz Stefanicki
07.03.2012, 23:35
Autor
@Adam, W tym miejscu musisz dodać nowe wartości: [code lang="php"]if(!empty($formName) && !empty($formEmail) && !empty($formText))[/code] Nowy wiersz dodaje się w ten sposób: [code lang="php"]$mailText = "Treść wiadomości:n$formTextnOd: $formName, $formEmail ($ip, $host)";[/code] Mowa tu o: <tt>n</tt>.
wieszczu
07.03.2012, 16:08
Może mi ktoś powiedzieć jak dodać inne pola do formularza? Dodałem telefon, tak jak tu było pokazane i działa, ale chciałem analogicznie dodać kilka innych i pojawia się wiadomość Wypełnij wszystkie pola formularza... Wielkie dzięki za pomoc.
Adam
23.08.2011, 23:51
Rozbudowałem formularz. Dodałem kilka dodatkowych pół, <code>input type="radio"</code> oraz listę rozwijaną <code>select name</code>. Co zmienić aby sprawdzał wypełnienie wszystkich także pola wyboru radio i select? Drugie pytanie - jak zrobić aby w otrzymanym e-mailu wysłanym z tego formularza dane z poszczególnych pół były oddzielone wolnym wierszem (pustą linią, jak )
Bartosz Stefanicki
24.07.2011, 01:52
Autor
someone, nie jest to wina formularza z itporady.pl, postępuj zgodnie z dokumentacją reCaptcha: http://code.google.com/intl/pl-PL/apis/recaptcha/docs/php.html
someone
19.07.2011, 21:38
Witam, chciałem podpiąc pod to recaptche, lecz mam jakiś problem z weryfikacja kodu bo cokolwiek bym nie wpisal to wyskakuje że źle captcha wpisana. Jakiś pomysł ?
Shadow
27.06.2011, 17:51
Dzięki, działa. Wcześniej robiłem podobnie tylko użyłem innej nazwy pola(tel) i nie działało.
Bartosz Stefanicki
27.06.2011, 17:15
Autor
@shadow 1) W kodzie formularza dodajemy pole dla telefonu: [code lang="html"]<tr> <td>E-Mail:</td> <td><input type="text" name="formEmail"/></td> </tr> <tr> <td>Telefon:</td> <td><input type="text" name="formPhone"/></td> </tr> <tr> <td>Treść wiadomości:</td> <td><textarea name="formText"></textarea></td> </tr>[/code] 2) W skrypcie na początku, tworzymy wartość $formPhone i przypisujemy jej dane otrzymane z formularza: [code lang="php"]//dane z formularza $formName = $_POST['formName']; $formEmail = $_POST['formEmail']; $formText = $_POST['formText']; $formPhone = $_POST['formPhone']; if(!empty($formName) && !empty($formEmail) && !empty($formPhone) && !empty($formText)) {[/code] 3) W skrypcie pod koniec, dodajemy wartość telefonu do treści wiadomości: [code lang="php"]//treść wiadomości $mailText = "Treść wiadomości:n$formTextnOd: $formName, $formEmail, $formPhone ($ip, $host)";[/code]
Shadow
27.06.2011, 14:25
Jak dodać jeszcze jedno pole (telefon) do formularza
Bartosz Stefanicki
17.04.2011, 02:11
Autor
Przekierowanie w PHP: [code lang="php"] header('refresh: 5; url=http://nazwa-strony.pl'); [/code]
alek
13.04.2011, 22:52
Witam, szybkie pytanie jak sprawic by po weryfikacji poprawnosci danych strona z informacjami o bledach i powodzeniach automatycznie (po 5 sekundach) wracala do formularza. Z gory dzieki.
Bartosz Stefanicki
21.03.2011, 00:03
Autor
Suchy, jeśli kogoś nie stać na płatny serwer to nie poradzę. Poza tym, większość darmowych hostingów posiada włączoną funkcję mail(). Rychu, skoro funkcjonował wcześniej to dziwne, żeby nagle się obraził i odmówił sam z siebie posłuszeństwa. Na hostingu cba.pl pewnie zmienili ustawienia, lub ograniczyli jakąś funkcję.
rychu
17.03.2011, 18:28
nie wiem czy to wina cba.pl czy coś innego ale od jakiegoś czasu nie działa mik ten fantastyczny formularz, a zawsze działał. Nie wiecie co się stało. ?
Suchy
23.11.2010, 15:11
...a na najlepsze z tego wszystkiego jest to, że funkcja mail nie działa na wszystkich serwerach lub ma ograniczoną ilość wywołań (głównie na darmowych serwerach). Lepiej pobawić się z SMPT
rychu
21.11.2010, 19:07
no niestety nic nie rozumiem z tego programu A pan wie jak to zrobic bo bardzo by mi się taki coś przydało.
Bartosz Stefanicki
21.11.2010, 21:34
Autor
@rychu, Możesz zainstalować prostą i bezpłatną aplikację Gmail na telefon komórkowy. Dzięki niej sprawdzisz nowe wiadomości na swojej poczcie. Jeśli masz tam konto to wystarczy, że się zalogujesz. W innym przypadku możesz założyć konto Gmail i tam przekierowywać nowe wiadomości z formularza.
Comandeer
21.11.2010, 22:52
Dawno się nie bawiłem Gammu, ale na phpclasses.org powinno być kilka prostych klas. Jednak używanie Gammu nie jest tanie, ponieważ program wysyła SMS-y z komórki podłączonej do kompa (czyli w tym przypadku musiałbyś mieć 2 komórki - jedną, z której wysyłasz i jedną, z której odbierasz). Wydaje mi się, że rozwiązanie przedstawione przez barteksa w tym przypadku jest lepsze.
rychu
21.11.2010, 11:55
dzień dobry czy nie da się zrobic takiego czegoś aby formularz był wysyłany na maila na na telefon była wysyłana wiadomośc ze takowy mail przyszedł?
Comandeer
21.11.2010, 17:00
Owszem, dałoby się. Zainteresuj się programem Gammu.
Comandeer
30.08.2010, 20:46
Sorry, mały błąd wkradł się do mojej funkcji checkMail. Oto poprawiona wersja: function checkMail($checkmail) { if(filter_var($checkmail, FILTER_VALIDATE_EMAIL)) return checkdnsrr(array_pop(explode("@",$checkmail)),"MX"); return false; }
Comandeer
30.08.2010, 00:19
Ja bym nie korzystał z checkdnsrr - a co jak serwer padł na 2 sekundy? Odrzucimy poprawnego maila. Zawsze lepiej przepuścić 5% błędnych niż odrzucić 0.5% poprawnych. Funkcję sprawdzającą mail można zapisać prościej: function checkMail($checkmail) { if(filter_var($checkmail, FILTER_VALIDATE_EMAIL)) return checkdnsrr(array_pop(explode("@",$checkmail)),"MX") } Tak, wiem - jestem minimalistą... Poza tym, formularz do wymiany. Tabelki i brak label. daje więcej możliwości niźli
Bartosz Stefanicki
30.08.2010, 22:55
Autor
@Comandeer, jest to małe ryzyko aczkolwiek możliwe, rozwiązanie podane przez Ciebie jest również jak najbardziej poprawne.