koszmos
(koszmos)
21 Sierpień 2018 20:20
#1
Witajcie, Mam takie pytanko do speców.
Jak w temacie niżej nakreśliłem mam sobie swój kodzik formularza kontaktowego. Ale pytanie, co mam jeszcze dodać aby wymagane było uzupełnienie wszystkich pól przed wysłaniem, ponieważ miałem problem ze spamerami którzy lecieli tylko po przycisku WYŚLIJ i dostawałem masę pustych wiadomości
Oto Kod
<?php
$field_name = $_POST['cf-name'];
$field_email = $_POST['cf-email'];
$field_message = $_POST['cf-message'];
$mail_to = 'mojmail@domena.pl';
$subject = 'Wiadomość z twojej strony internetowej od '.$field_name;
$body_message = 'Od: '.$field_name."\n";
$body_message .= 'E-mail: '.$field_email."\n";
$body_message .= 'Wiadomosc: '.$field_message;
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers = 'From: '.$mail_to."\r\n";
$headers .= 'Reply-To: '.$field_email."\r\n";
$mail_status = mail($mail_to, $subject, $body_message, $headers);
if ($mail_status) { ?>
<script language="javascript" type="text/javascript">
alert('Dziekujemy za Wiadomość, odezwiemy się niebawem.');
window.location = 'http://google.pl';
</script>
<?php
}
else { ?>
<script language="javascript" type="text/javascript">
alert('Błąd wysłania wiadomośći.');
window.location = 'http://google.pl';
</script>
<?php
}
?>
Natomiast w kodzie strony prezentuje się to tak
<form class=" bd-form-2 "
action="contact.php"
name="cf-form" method="post">
<div class="bd-container-inner">
<div class="container-fluid">
<div class=" bd-input-2 form-group">
<label class="bd-form-label">Imię</label>
<input type="text" class="bd-form-input"
placeholder="Imie lub nazwa Firmy"
name="cf-name" >
</div>
<div class=" bd-input-5 form-group">
<label class="bd-form-label">Email</label>
<input type="text" class="bd-form-input"
placeholder="Email"
name="cf-email" >
</div>
<div class=" bd-textarea-2 form-group">
<label class="bd-form-label">Zapytanie</label>
<textarea class="bd-form-input"
name="cf-message"
placeholder="Wpisz Treść Zapytania"></textarea>
</div>
<a
onclick="jQuery(this).closest('form').submit();" href="#" class="bd-linkbutton-14 bd-button-22 bd-own- margins bd-content-element" >
Wyślij
</a>
</div>
</div>
</form>
Fizyda
(Fizyda)
21 Sierpień 2018 20:44
#2
Dodanie atrybutu required
w inputach w html plus sprawdzenie w php czy podano wszystkie dane. Choćby głupim isset
.
Warto byłoby też rozszerzyć całość o walidację poprawności wprowadzonych danych.
koszmos
(koszmos)
21 Sierpień 2018 20:46
#3
Dzięki za Odpowiedź, ale przyznam się wprost że cięzko u mnie z tym, byłbyś mi w stanie pomóc ?
<input type="text" required> Wystarczy ?
Czyli w tym przypadku
<input type="text" required class="bd-form-input"
placeholder="Email"
name="cf-email" >
Fizyda
(Fizyda)
21 Sierpień 2018 20:52
#4
Nie, całości na pewno Ci nie napiszę. Mogę jedynie wskazać materiały z informacjami jakie będą Ci potrzebne. Chociaż na podstawie tego co Ci napisałem powinieneś już być w stanie szybko wygooglować sobie potrzebne informacje.
Tutaj masz required: https://www.w3schools.com/tags/att_input_required.asp
Podstawowa walidacja w HTML to określenie odpowiedniego typu inputa: https://www.w3schools.com/tags/att_input_type.asp ewentualnie jeśli to niezbędne zabawa z patternami: https://www.w3schools.com/tags/att_input_pattern.asp
Tyle jako minimum powinno wystarczyć. Walidację w JS na tym poziomie można pominąć.
Sprawdzanie w PHP czy formularz jest uzupełniony: https://www.w3schools.com/php/php_form_required.asp
Walidacja w PHP (też powinna być): https://www.w3schools.com/php/php_form_url_email.asp lub bardziej skomplikowany przykład https://www.w3schools.com/php/php_form_validation.asp
EDIT:
Najważniejsze jest sprawdzenie w PHP bo tego nie da się obejść. Required da się obejść więc nie na wszystkich spamerów to zadziała.
koszmos
(koszmos)
21 Sierpień 2018 20:58
#5
Fizyda
(Fizyda)
21 Sierpień 2018 20:59
#6
koszmos
(koszmos)
21 Sierpień 2018 21:04
#7
To oczywiste
Powiedz mi jeszcze jak możesz, jak masz ciąg, w php
if (empty($_POST["name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}
Z poradnika
To odpowiednio u mnie powinien wyglądać tak:
if (empty($_POST["cf-name"])) {
$nameErr = "Name is required";
} else {
$name = test_input($_POST["name"]);
}
A w Kodzie zamiast
<label class="bd-form-label">Imię</label>
<input type="text" class="bd-form-input"
placeholder="Imie lub nazwa Firmy"
name="cf-name" >
Powinno być
Imię
<input type="text" class="bd-form-input"
placeholder="Imie lub nazwa Firmy"
name="cf-name" >
<span class="error">* <?php echo $nameErr;?></span>
Dobrze kombinuje ?
oczywiście to przykład jednej tabeli
Fizyda
(Fizyda)
21 Sierpień 2018 21:09
#8
Jeśli formularz i jego obsługę masz w tym samym pliku czyli contact.php to tak, dobrze kombinujesz. Masz tylko 2 błędy. Pierwszy to musisz jeszcze tutaj zmienić nazwę:
$name = test_input($_POST["name"]);
Drugi to musisz napisać sobie funkcję test_input bo taka nie istnieje i jest ona tylko jako przykład. Przyczym jeśli nie chcesz walidować danych tylko sprawdzać czy są podane to możesz pro prostu zastąpić to czymś takim:
$field_name = $_POST["name"];
Tylko wcześniej utwórz zmienne bez wartości w taki sposób:
$field_name = '';
$field_email = '';
$field_message = '';
koszmos
(koszmos)
21 Sierpień 2018 21:27
#10
Sprawdź z łaski swojej teraz to w takim razie. Dziękuje
<?php
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["cf-name"])) {
$nameErr = "Name is required";
} else {
$field_name = $_POST["cf-name"];
}
if (empty($_POST["cf-email"])) {
$emailErr = "Email is required";
} else {
$field_name = $_POST["cf-email"];
}
if (empty($_POST["cf-message"])) {
$comment = "";
} else {
$field_name = $_POST["cf-message"];
}
}
$field_name = $_POST['cf-name'];
$field_email = $_POST['cf-email'];
$field_message = $_POST['cf-message'];
$mail_to = 'xxx@xxxs.pl';
$subject = 'Wiadomość z xxx.pl od '.$field_name;
$body_message = 'Od: '.$field_name."\n";
$body_message .= 'E-mail: '.$field_email."\n";
$body_message .= 'Wiadomosc: '.$field_message."Content-type: text/plain; charset=UTF-8";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers = 'From: '.$mail_to."\r\n";
$headers .= 'Reply-To: '.$field_email."\r\n";
$mail_status = mail($mail_to, $subject, $body_message, $headers);
if ($mail_status) { ?>
<script language="javascript" type="text/javascript">
alert('Dziekujemy za Wiadomość, odezwiemy się niebawem.');
window.location = 'http://xxx.pl';
</script>
<?php
}
else { ?>
<script language="javascript" type="text/javascript">
alert('Błąd wysłania wiadomośći.');
window.location = 'http://xxx.pl';
</script>
<?php
}
?>
Fizyda
(Fizyda)
21 Sierpień 2018 21:43
#11
To już jest niepotrzebne bo wartości nadajesz w IFach
$field_name = $_POST['cf-name'];
$field_email = $_POST['cf-email'];
$field_message = $_POST['cf-message'];
Plus jeszcze przeniesienie kilku linijek do innego ifa i finalnie powinno być coś takiego:
<?php
$nameErr = $emailErr = $genderErr = $websiteErr = "";
$name = $email = $gender = $comment = $website = "";
if ($_SERVER["REQUEST_METHOD"] == "POST") {
if (empty($_POST["cf-name"])) {
$nameErr = "Name is required";
} else {
$field_name = $_POST["cf-name"];
}
if (empty($_POST["cf-email"])) {
$emailErr = "Email is required";
} else {
$field_name = $_POST["cf-email"];
}
if (empty($_POST["cf-message"])) {
$comment = "";
} else {
$field_name = $_POST["cf-message"];
}
$mail_to = 'xxx@xxxs.pl';
$subject = 'Wiadomość z xxx.pl od '.$field_name;
$body_message = 'Od: '.$field_name."\n";
$body_message .= 'E-mail: '.$field_email."\n";
$body_message .= 'Wiadomosc: '.$field_message."Content-type: text/plain; charset=UTF-8";
$headers = 'MIME-Version: 1.0' . "\r\n";
$headers = 'From: '.$mail_to."\r\n";
$headers .= 'Reply-To: '.$field_email."\r\n";
$mail_status = mail($mail_to, $subject, $body_message, $headers);
if ($mail_status) { ?>
<script language="javascript" type="text/javascript">
alert('Dziekujemy za Wiadomość, odezwiemy się niebawem.');
window.location = 'http://xxx.pl';
</script>
<?php
}
}
else { ?>
<script language="javascript" type="text/javascript">
alert('Błąd wysłania wiadomośći.');
window.location = 'http://xxx.pl';
</script>
<?php
}
?>
Przy czym jeśli to jest cały Twój plik i formularz trzymasz w innym pliku to możesz zrezygnować z podawania błędów bo ich nie używasz, w tedy sprawdzanie będzie wyglądało mniej więcej tak:
if (!empty($_POST["cf-email"])) {
$field_name = $_POST["cf-email"];
}
No i musisz nadawać wartości odpowiednim zmiennym, a nie za każdym razem:
$field_name = $_POST["cf-name"];
$field_name = $_POST["cf-email"];
$field_name = $_POST["cf-message"];
To jest duży błąd.