Обработка одной и той же страницы
Как можно обработать форму на одной странице по сравнению с использованием отдельной страницы процесса. Прямо сейчас для регистрации, отправки комментариев и т. Д. Я использую вторую страницу, которая проверяет данные, а затем отправляет и направляет обратно на home.php . Как я могу сделать так, чтобы при отправке сама страница проверялась, а не использовалась вторая страница.
6 answers
Вы можете указать форме, чтобы она была отправлена самому PHP, а затем проверить переменные $_POST
для обработки формы. Этот метод очень хорош для проверки ошибок, так как вы можете установить ошибку, а затем перезагрузить форму с любой информацией, которую ранее отправил пользователь, все еще в такте (т. Е. Они не теряют свою отправку).
Когда нажата кнопка "отправить", она разместит информацию на той же странице, запустив PHP-код вверху. Если произойдет ошибка (на основе ваших проверок), форма будет перезагружена для пользователя с отображаемыми ошибками и любой информацией, предоставленной пользователем, все еще в полях. Если ошибка не произойдет, вместо формы отобразится страница подтверждения.
<?php
//Form submitted
if(isset($_POST['submit'])) {
//Error checking
if(!$_POST['yourname']) {
$error['yourname'] = "<p>Please supply your name.</p>\n";
}
if(!$_POST['address']) {
$error['address'] = "<p>Please supply your address.</p>\n";
}
//No errors, process
if(!is_array($error)) {
//Process your form
//Display confirmation page
echo "<p>Thank you for your submission.</p>\n";
//Require or include any page footer you might have
//here as well so the style of your page isn't broken.
//Then exit the script.
exit;
}
}
?>
<form method="post" action="<?=$_SERVER['PHP_SELF']?>">
<?=$error['yourname']?>
<p><label for="yourname">Your Name:</label><input type="text" id="yourname" name="yourname" value="<?=($_POST['yourname'] ? htmlentities($_POST['yourname']) : '')?>" /></p>
<?=$error['address']?>
<p><label for="address">Your Address:</label><input type="text" id="address" name="address" value="<?=($_POST['address'] ? htmlentities($_POST['address']) : '')?>" /></p>
<p><input type="submit" name="submit" value="Submit" /></p>
</form>
Самая простая конструкция - определить, не является ли массив $_POST
пустым
if(isset($_POST['myVarInTheForm'])) {
// Process the form
}
// do the regular job
Вы можете проверить, был ли это запрос на публикацию внутри кода страницы, а затем проверить данные. Если это был запрос на ПОЛУЧЕНИЕ - просто покажите форму.
Но, пожалуйста, помните, что это хорошая практика, чтобы показывать результаты успешной отправки формы на другой странице, обслуживаемой с помощью запроса GET, т.Е. На любую успешную публикацию формы следует отвечать перенаправлением на страницу успеха.
Вы, конечно, могли бы изучить запросы AJAX, где вы могли бы выполнить асинхронный вызов скрипта обработчика, а затем обновить, а затем обновить отправляющую страницу сообщением об успешном выполнении. Это создает впечатление "Обработки одной и той же страницы", т. е. Страницу не нужно обновлять.
Однако это действительно зависит от эффекта, которого вы пытаетесь достичь.
@Майкл Иригойен: Он работает нормально, но при первом запуске/загрузке он показывает:
" Примечание: Неопределенная переменная: ошибка в C:\xampp\htdocs\same_page.php в режиме онлайн 28"
Как обращаться с этим уведомлением?
Теперь понял: "Используется isset, @и т. Д. чтобы подавлять ошибки..." "Работает как заклинание!!!" "Теперь я попробую это на своем коде..."
Я сохранил сообщение с благодарностью и обновил его с помощью переменных сеанса.
if(!is_array($error)){
$_SESSION['message'] = 'Thank You!';
header('Location: yourpage.php');
exit();
}
А затем используйте это в верхней части формы:
if(isset($_SESSION['message'])){
echo $_SESSION['message'];
unset($_SESSION['message'];
}
Это должно обновить страницу и показать сообщение, а затем, если они обновят страницу, переменная сеанса будет пустой, поэтому спасибо не будет отображаться. Это называется флэш-сообщением.