Подтвердить что ты не робот

PHP header() перенаправляет переменные POST

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

HTML будет выглядеть так:

<form name="example" action="action.php" method="POST">
  <input type="text" name="one">
  <input type="text" name="two">
  <input type="text" name="three">
  <input type="submit" value="Submit!">
</form>

action.php будет выглядеть следующим образом:

if(error_check($_POST['one']) == true){
    header('Location: form.php');
    // Here is where I need the data to POST back to the form page.
} else {
    // function to insert data into database
    header('Location: posted.php');
}

В случае ошибки мне нужно вернуть POST на первую страницу. Я не могу использовать GET, потому что вход будет слишком большим. Я не хочу использовать СЕССИЮ, если это возможно. Это возможно?

4b9b3361

Ответ 1

Если вы не хотите использовать сеансы, единственное, что вы можете сделать, это POST на той же странице. Какой ИМО является лучшим решением в любом случае.

// form.php

<?php

    if (!empty($_POST['submit'])) {
        // validate

        if ($allGood) {
            // put data into database or whatever needs to be done

            header('Location: nextpage.php');
            exit;
        }
    }

?>

<form action="form.php">
    <input name="foo" value="<?php if (!empty($_POST['foo'])) echo htmlentities($_POST['foo']); ?>">
    ...
</form>

Это можно сделать более элегантным, но вы получите идею...

Ответ 2

// from http://wezfurlong.org/blog/2006/nov/http-post-from-php-without-curl
function do_post_request($url, $data, $optional_headers = null)
{
  $params = array('http' => array(
              'method' => 'POST',
              'content' => $data
            ));
  if ($optional_headers !== null) {
    $params['http']['header'] = $optional_headers;
  }
  $ctx = stream_context_create($params);
  $fp = @fopen($url, 'rb', false, $ctx);
  if (!$fp) {
    throw new Exception("Problem with $url, $php_errormsg");
  }
  $response = @stream_get_contents($fp);
  if ($response === false) {
    throw new Exception("Problem reading data from $url, $php_errormsg");
  }
  return $response;
}

Ответ 3

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

Вы можете использовать Ajax для отправки формы в фоновом режиме. Таким образом, ваши значения форм остаются неизменными. Если сервер принимает, вы можете перенаправить на другую страницу. Если сервер не принимает, то вы можете отобразить сообщение об ошибке, разрешить пользователю исправлять ввод и отправлять его снова.

Ответ 4

Было бы полезно проверить данные формы перед отправкой через POST. Вы должны создать функцию JavaScript, чтобы проверить форму на наличие ошибок, а затем отправить форму. Это предотвратит отправку данных снова и снова, возможно, замедляя работу браузера и используя объем передачи на сервере.

Edit:

Если безопасность является проблемой, выполнение запроса AJAX для проверки данных будет лучшим способом. Ответ от запроса AJAX определит, должна ли быть представлена ​​форма.

Ответ 5

Используйте шаблон smarty для вашего материала, а затем просто установите массив POST в качестве массива smarty и откройте шаблон. В шаблоне просто выделите массив так, чтобы он прошел:

if(correct){
    header("Location: passed.php");
} else {
    $smarty->assign("variables", $_POST);
    $smarty->display("register_error.php");
    exit;
}

Я еще не пробовал это, но я собираюсь попробовать это как решение и дам вам знать, что я нахожу. Но, конечно, этот метод предполагает, что вы используете smarty.

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

ех.

register.php?name=mr_jones&address==......
echo $_GET[name];