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

leon
11.10.2012, 22:24
witam formularz wyrzuca mi blad: Parse error: syntax error, unexpected '}' in [...] on line 3 o co moze chodzic, skopiowalem twoj kod do pliku php wraz z poprawkami adriana i commandera - pomoz.. warto dodac ze pierwszy kod z tabelki wklejami do szablonu strony a drugi kod - to juz formularz php do zapisu w notatniku z rozszerzeniem php
Bartosz Stefanicki
19.10.2012, 16:26
Autor
@Leon, Spróbuj wstawić kod z porady bez żadnych poprawek i sprawdź czy działa, daj znać. Jeżeli pytasz o weryfikację, polecam captcha.
Jaason
28.08.2012, 22:20
A ja mam taki błąd, funkcja checkMail się sypie. Co prawda odpalone na localhoście ale kto wie czy to nie grubsza sprawa. [code lang="html"]Strict Standards: Only variables should be passed by reference in C:xampphtdocstestformsend.php on line 39[/code]
miszcz
28.07.2012, 17:51
A ja mam zupelnie inny problem... Wiadomosci dochodza tylko jesli w polu nadawcy maila podam swoj email:D Jesli podam jakikolwiek inny poprawny adres, niby wiadomosc wyslana ale nic nie dochodzi. Jesli wpisze nieistniejacy lub bledny adres email, wtedy jest info o bledzie. Ale jakim cudem wiadomosci dochodza tylko jesli w polu email podam adres swojego meila ? I tylko na yahoo, jesli podam przyklamdowo o2 - lipa, nie ma info o bledzie ale nic nie dochodzi. Co jest grane ?
miszcz
28.07.2012, 19:59
....ok miszcz PHP rozwiazal juz swoj problem. Ale oszczegam, jesli jeszcze raz mi cos nie zadziala to bede scigal autora postu :D
Ernesto
19.07.2012, 14:41
[code lang="php"][/code] Oto sposób na panowanie nad wymiarami pól.
as
18.07.2012, 12:08
pokazuje mi taki komunikat ;[[: Fatal error: Call to undefined function: filter_var() in /homez.323/gniazdo/www/kurier24/proba.php on line 44 o co tu chodzi: linia 44 to: if(filter_var($checkmail, FILTER_VALIDATE_EMAIL)) {
Bartosz Stefanicki
04.08.2012, 12:11
Autor
@As, http://itporady.pl/html-css/prosty-formularz-kontaktowy-w-php/#comment-202 Sprawdź czy masz włączone filter_var() na serwerze.
Bartosz Stefanicki
17.07.2012, 17:49
Autor
@Tomasz, Sprawdź czy wszystkie funkcje masz włączone, plik musi mieć rozszerzenie .php
Tomasz
11.07.2012, 11:51
Jak ten skrypt wstawić w plik html? index. Jak wchodze na ten skrypt wypełniam dane klikam "OK" i wiadomości ma maila nei otrzymuje. Używam XAMPP 1.7.7
Tomasz
11.07.2012, 12:00
Wprowadziłem wszystko ponownie i teraz wyskakuje mi błąd w 44 lini.. tj.: if(checkdnsrr(array_pop(explode("@",$checkmail)),"MX")){
Paweł
02.07.2012, 08:55
jeszcze jedno w kturym miejscu dokładnie wstawić ten header ?
Paweł
02.07.2012, 08:52
Witam mam takie pytanie jak w tym formularzu zrobić swój przycisk (obrazek z napisem wyślij )
Adrian
05.06.2012, 22:45
Po dwóch dniach męki doszedłem do błedu a mianowicie wystarczy zmienić w tym miejscu //adres zwrotny $mailHeader = "From: $formName "; na //adres zwrotny $mailHeader = "Content-type: text/plain; charset=utf-8";
Grzegorz
03.06.2012, 20:08
Niestety dalej to samo... Z funkcją kodującą znaki - maile nie przechodzą. Bez funkcji - maile przechodzą. Kodowanie zmieniłem na "utf-8". Jest jeszcze jakaś możliwość?
Bartosz Stefanicki
03.06.2012, 17:54
Autor
@Grzegorz, Windowsowego kodowania nie używa się już. Pozmieniaj na uniwersalne UTF-8.
Grzegorz
03.06.2012, 17:22
Zrobiłem tak jak napisałeś. Zmieniłem tylko "utf-8" na "Windows-1250" bo cała strona chodzi na tych kodach. Funkcje się chyba wykonują bo nie wyskakują błędy. Otwiera się strona że Wiadomość została wysłana, lecz na pocztę maile nie dochodzą. Jak usuwam funkcję to przechodzą bez problemu. Co może być tego przyczyną?
Bartosz Stefanicki
02.06.2012, 22:16
Autor
@Grzegorz, dodaj do kodu: [code lang="php"]//adres zwrotny $mailHeader = "From: $formName <$formEmail>"; $mailHeader .= "Content-type: text/plain; charset=utf-8rn";[/code]
Grzegorz
01.06.2012, 23:27
Jest jeszcze jeden problem. Formularz na pocztę dochodzi bez polskich znaków. Gdzie wstawić funkcję "charset" i jak poprawnie powinna wyglądać?
Bartosz Stefanicki
17.05.2012, 13:52
Autor
@asia, Header to nagłówek, czyli na początku kodu.
asia
16.05.2012, 13:38
Mam pytanie, w którym miejscu w formularzu wstawić kod? [code lang="php"]header('refresh: 5; url=http://nazwa-strony.pl');[/code]
Bartosz Stefanicki
13.05.2012, 18:37
Autor
@mati, Sprawdź czy masz włączone filter_var() na serwerze.
mati
08.05.2012, 13:26
Witam wszystkich! A co jeśli formularz poprawnie podpięty wyświetla takie info jak chce się wysłać wiadomość: "Fatal error: Call to undefined function filter_var().... " a na localhoscie jest "Błąd: wiadomość nie została wysłana"
Bartosz Stefanicki
07.03.2012, 23:36
Autor
@Wieszczu, Nie zapomnij o weryfikacji danych które sprawdzane są przy przetwarzaniu formularza, w tym miejscu: [code lang="php"]if(!empty($formName) && !empty($formEmail) && !empty($formText))[/code]