Вот мой код. Когда я заполняю форму только одним вводом, данные отправляются и после этого показывается предупреждение. Но если я ничего не заполняю в форме и просто нажимаю на кнопку submit, предупреждение показывается, даже если форма пуста. И после отображения предупреждения выводится сообщение о необходимости заполнения поля ввода. Так что же пошло не так? Я пытался найти решение и перепробовал множество вещей, но ничего не работает...
<div class="newsletter">
<p>Sign Up for the <strong>NEWSLETTER</strong></p>
<form method="post">
<?php
if(isset($_POST['subscribe'])) {
$e_mail = $_POST['e_mail'];
$conn = new mysqli('localhost','root','','purrfect_whiskers');
if($conn->connect_error) {
echo "$conn->connect_error";
die("Connection Failed : ". $conn->connect_error);
} else {
$stmt = $conn->prepare("insert into newsletter(e_mail) values(?)");
$stmt->bind_param("s", $e_mail);
$stmt->execute();
$stmt->close();
$conn->close();
}
}
?>
<input class="input" type="email" name="e_mail" text-transform="lowercase" placeholder="Enter Your Email" autocomplete="off" required="required">
<button class="subscribe" onclick="submit_email()" type="submit" name="subscribe"><i class="fa fa-envelope"></i> Subscribe</button>
<script type="text/javascript">function submit_email(){alert("You've been subscribed to our newsletter!");}</script>
</form>
</div>
Ответ 1
Похоже, вы должны сначала проверить, действительно ли пользователь ввел значение для электронной почты, прежде чем разрешить отправку. Если этого не сделано, отображайте ошибку. Если же поле заполнено, разрешите отправку и при обновлении страницы представьте предупреждение об успешном завершении.
Есть несколько способов предотвратить автоматическую отправку формы, один из них - поместить onsubmit обработчик в form тег и вернуть его true(чтобы разрешить отправку или false, чтобы предотвратить ее. Вы можете выполнить все свои проверки в этом обработчике:
<form method="POST" onsubmit="return submit_email()">
Затем в своей функции убедитесь, что значение в поле существует, прежде чем разрешить продолжение операции:
<script type="text/javascript">
function submit_email(){
let email_input = document.querySelector("input[name='e_mail']");
if (email_input.value=="") {
alert("Пожалуйста, сначала введите свой e-mail ");
return false; // это предотвращает отправку формы
}
return true; // здесь возможна отправка формы
}
</script>
Форма будет отправлена, страница обновится, и ваш PHP-код сделает все верно. В конце просто закодируйте свое предупреждение, например так:
<?php
if(isset($_POST['subscribe'])){
// выполните весь свой код как есть, а затем закончите его:
?>
<script>
alert("Вы подписаны на нашу рассылку!");
</script>
<?php
}
?>
Ответ 2
Код предупреждения выполняется несмотря ни на что. Поэтому вы должны отображать его только в том случае, если в вашей форме ничего не введено. Для этого я добавил идентификатор в ваш ввод и проверил, пуста ли ваша форма или нет. Лучше всего проверить с помощью регулярного выражения, действительно ли это адрес электронной почты. Вот код, который проверяет это:
<div class="newsletter">
<p>Sign Up for the <strong>NEWSLETTER</strong></p>
<form method="post">
<?php
if(isset($_POST['subscribe'])) {
$e_mail = $_POST['e_mail'];
$conn = new mysqli('localhost','root','','purrfect_whiskers');
if($conn->connect_error) {
echo "$conn->connect_error";
die("Connection Failed : ". $conn->connect_error);
} else {
$stmt = $conn->prepare("insert into newsletter(e_mail) values(?)");
$stmt->bind_param("s", $e_mail);
$stmt->execute();
$stmt->close();
$conn->close();
}
}
?>
<input id="id_input" class="input" type="email" name="e_mail" text-transform="lowercase"
placeholder="Введите свой Email"
autocomplete="off" required="required">
<button class="subscribe" onclick="submit_email()" type="submit" name="subscribe"><i class="fa fa-envelope"></i>
Подписка
</button>
<script type="text/javascript">function submit_email() {
if (document.getElementById("id_input").value !== "") {
alert("Вы подписаны на нашу рассылку!");
}
}</script>
</form>
</div>
Web