Простой пример кода после перенаправления - PullRequest
36 голосов
/ 10 ноября 2010

Я нашел много сайтов, которые описывают PRG, но нет простого примера кода PHP.


Вот что я реализовал:

  1. У form.php есть действие:validate.php.
  2. validate.php пользователь никогда не видит;if проверяет все $_GET и, если valid записывает его в базу данных и генерирует HTML страницы подтверждения /, если он недействителен, генерирует HTML страницы ошибки, объясняющей, что не так.
  3. Независимо от того, сгенерирован HTML, он сохраняется в переменной $_SESSION, а затем validate.php вызывает header('Location: <as appropriate>);.
  4. submitted.php из invalid_input.php (в случае, если пользователь читает URL) состоит только из echo $_SESSION['form_html'];.

Это мне кажется защитой как от перезагрузки страницы, так и от проблем с кнопками возврата.

Я дурак, пытаясь заново изобрести колесо?

Ответы [ 6 ]

67 голосов
/ 10 ноября 2010

Простейший сценарий:

if ($_POST) {
   // Execute code (such as database updates) here.

   // Redirect to this page.
   header("Location: " . $_SERVER['REQUEST_URI']);
   exit();
}

Использование REQUEST_URI.Не используйте PHP_SELF, как в большинстве систем и сред CMS PHP_SELF будет означать /index.php.

25 голосов
/ 10 ноября 2010

Фрагмент кода:

if (count($_POST)) {
    // process the POST data
    // your code here- so for example to log a user in, register a new account..
    // ...make a payment...etc

    // redirect to the same page without the POST data, including any GET info you
    // want, you could add a clause to detect whether processing the post data has 
    // been successful or not, depending on your needs

    $get_info = "?status=success";

    // if not using rewrite
    // header("Location: ".$_SERVER['PHP_SELF'].$get_info);

    // if using apache rewrite
    header("Location: ".$_SERVER['REQUEST_URI'].$get_info);
    exit();
}
11 голосов
/ 10 ноября 2010
    Browser
   HTML form
  method=POST
       |
       v
    PHP app
  reads $_POST
sends 303 header
       |
       v
    Browser
receives header
 redirected to
   new page
       |
       v
    PHP app
  reads $_GET
 does whatever

Обычное использование - аутентификация при входе.Это процесс, когда пользователь отправляет форму входа.Приложение PHP аутентифицирует пользователя через $ _POST vars.Отправляет заголовок 303 обратно в браузер, когда пользователь успешно прошел аутентификацию.Таким образом, пользователь перенаправляется на новую страницу.

4 голосов
/ 20 июня 2016

Я хотел бы познакомить вас с методом, который часто используется в более широком масштабе и гораздо более подробно в рамках.

Что мы собираемся делать

У нас есть файлс именем index.php.

  • Мы собираемся отправить форму
  • Мы собираемся проверить эту отправку
  • Мы добавим данные POST в сеанс
  • Мы перенаправим пользователя на страницу подтверждения
  • Мы отобразим данные и дадим пользователю подтверждение.
  • Мы отправим и окончательно обработаем данные.
  • Мы перенаправим обратно на index.php и покажем уведомление.

Код

<code><?php
if (!isset($_SESSION)) session_start();

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    switch ($_POST['submit']) {
        case 'add':
            // This is where our first POST will end up
            // We can perform actions such as checking the data here

            // After that we will add the POST data to a session
            $_SESSION['postdata'] = $_POST;
            // and unset the $_POST afterwards, to prevent refreshes from resubmitting.
            unset($_POST);

            // Now we will redirect...
            header("Location: ".$_SERVER['PHP_SELF']);
            break;
        case 'confirm':
            // We can now insert the data into the database or email it

            // Then we will unset the session and redirect back
            unset($_SESSION['postdata']);

            // This is to display our notification
            $_SESSION['success'] = true;

            // And there we go again...
            header("Location: ".$_SERVER['PHP_SELF']);
            break;
    }
    // We will exit here because we don't want the script to execute any further.
    exit;
}
?>

<?php if (isset($_SESSION['success']) && $_SESSION['success'] == true): ?>
    <p>Our data has been processed succesfully</p>
    <?php unset($_SESSION['success']); ?>
<?php endif; ?>

<?php if (isset($_SESSION['postdata'])): ?>
    <p>
        You want to add the following data:<br />
        <pre><?php print_r($_SESSION['postdata']); ?>
Это правильно?Да

Добавить что-нибудь

3 голосов
/ 22 января 2014

Caller.htm

<form method="post" action="Callee.php?Query1">
    <input type="text"   name="PostData" />
    <input type="submit" value="Go"      />
</form>

Callee.php (вызывается дважды.)

if ($_POST) {
    header("Location: ". $_SERVER['REQUEST_URI']. 'Query2'); 
    // PART1: Use $_POST and $_GET to execute database updates here...

    // Now any display (i.e. echo or print) will come after the header.
    // ...


   die;  // When done, GET 'myself' to execute PART2 below.
}


// PART2: Results page goes here...
echo 'PART 2 display output: '; var_dump($_GET);

Обратите вниманиезадействованы две строки запроса

Посмотрите, что var_dump говорит о $ _GET:

PART 2 display output: array(1) { ["Query1Query2"]=> string(0) "" } 

Проблемы с размещением заголовка в конце процедуры POSTследующий раздел:

header("Location: ". $_SERVER['REQUEST_URI']. 'Query2'); die;

В руководстве по PHP написано: «Помните, что header () должна вызываться перед отправкой любого фактического вывода, либо обычными HTML-тегами, пустыми строками в файле, либоиз PHP. Это очень распространенная ошибка при чтении кода с включенными или требующими функциями или другой функцией доступа к файлу, с пробелами или пустыми строками, которые выводятся до вызова header (). Та же проблема существует при использовании одногоФайл PHP / HTML. "

Однако, если вам нужно построить 'Query2' на основе того, что происходит в разделе POST, возможно, он должен находиться внизу раздела POST.Это нормально, если вы не пытаетесь вставить эхо над ним, даже для тестирования.

1 голос
/ 25 марта 2018

Вот form.php

<?php
session_start();
// 1) _____________________________________________ POST _____________________________
if ( count($_POST) ) {
    $ermsg ='';
    …
    check data, write some data to database(s), set error message(s) if any
    …
    $userdata1 = $_POST['htUserdata1'];
    $userdata2 = $_POST['htUserdata2'];
    …

    $_SESSION['PRG'] = array('field1'=>$userdata1,'field2'=>$userdata1,…,'ermsg'=>$ermsg);
    session_write_close();
    header('Location: ' . $_SERVER['REQUEST_URI'].'?z',true,303);
    exit;
// 2) _____________________________________________ REDIRECT ________________________
} else if ( array_key_exists('PRG',$_SESSION) ) {
    $userdata1 = $_SESSION['PRG']['field1'];
    $userdata2 = $_SESSION['PRG']['field2'];
    …
    $ermsg = $_SESSION['PRG']['ermsg'];
    unset($_SESSION['PRG']);
// 3) _____________________________________________ GET ______________________________
} else {
    …
    retrieve data from database(s)
    …
    $userdata1 = dbGet1();
    $userdata2 = dbGet2();
    …
    $ermsg = '';
}
// 4) _____________________________________________ DISPLAY _________________________
?>
<!DOCTYPE html>
<html lang="fr">
    …
<form method="post" action="form.php" accept-charset="utf-8">
        <input id="htUserdata1" name="htUserdata1" type="text"/>
        <input id="htUserdata2" name="htUserdata2" type="text"/>
        …
</form>
<script language="javascript">
"use strict";
<?php
$G['htUserdata1'] = $userdata1;
$G['htUserdata2'] = $userdata2;
    …
$G['ermsg'] = $ermsg;
$myJSON = json_encode($G);
echo "var G=$myJSON;";
?>
document.getElementById('htUserdata1').value = G.htUserdata1;
document.getElementById('htUserdata2').value = G.htUserdata2;
    …
if ( G.ermsg !=='')    alert(G.ermsg);
</script></body></html>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...