Одинаковая обработка страниц - PullRequest
7 голосов
/ 24 января 2011

Как можно обрабатывать форму на той же странице по сравнению с использованием отдельной страницы процесса. Прямо сейчас для регистрации, представления комментариев и т. Д. Я использую вторую страницу, которая проверяет данные, а затем отправляет и направляет обратно в home.php. Как я могу сделать так, чтобы при отправке сама страница проверяла, а не использовала вторую страницу.

Ответы [ 6 ]

14 голосов
/ 24 января 2011

Вы можете указать форму для отправки самому 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>
7 голосов
/ 24 января 2011

Самая простая конструкция - определить, не является ли массив $_POST пустым

if(isset($_POST['myVarInTheForm'])) {
  // Process the form
}

// do the regular job
2 голосов
/ 24 января 2011

вы можете проверить, был ли это запрос POST внутри кода страницы, а затем проверить данные. Если это был запрос GET - просто покажи форму.

Но, пожалуйста, помните, что это хорошая практика - показывать успешные результаты отправки формы на другой странице, обслуживаемой через запрос GET, т. Е. На любую успешную форму POST следует отвечать перенаправлением на страницу успеха.

1 голос
/ 24 января 2011

Вы, конечно, можете изучить запросы AJAX, где вы будете выполнять асинхронный вызов скрипта-обработчика, а затем обновлять, а затем обновлять отправляющую страницу сообщением об успешном завершении.Это создает впечатление «обработки той же страницы», т. Е. Страница не должна обновляться.

Однако это действительно зависит от эффекта, который вы пытаетесь достичь.

0 голосов
/ 01 июня 2014

Я сохранил сообщение с благодарностью и обновился с использованием переменных сеанса.

if(!is_array($error)){
    $_SESSION['message'] = 'Thank You!';
    header('Location: yourpage.php');
    exit();
} 

и затем используйте это в верхней части формы:

if(isset($_SESSION['message'])){ 
    echo $_SESSION['message'];
    unset($_SESSION['message'];
} 

Это должно обновить страницу и показать сообщение, а затем, если они обновят страницу, переменная сеанса будет пустой, поэтому спасибо не будет отображаться. Это называется флэш-сообщением.

0 голосов
/ 25 июля 2011

@ Michael Irigoyen: Работает нормально, но при первом запуске / загрузке показывает:

"Примечание: неопределенная переменная: ошибка в C: \ xampp \ htdocs \ same_page.php в строке 28"

Как обработать это уведомление?

Понял сейчас: «Используется isset, @ и т. Д. Для подавления ошибок ...» "Работает как шарм !!!" «Теперь я попробую это на своем коде ...»

...