PHP открывает другую веб-страницу с данными POST

Я новичок в PHP, и я пытаюсь сделать что-то, что может быть плохой практикой и может оказаться невозможным. По сути, я просто собираю что-то вместе, чтобы проверить свои знания и посмотреть, на что способен PHP.

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

Я знаю, что могу использовать header('Location: page.php');, но я не могу решить, как предоставить данные POST с этим. Как я могу это сделать? В качестве альтернативы, есть ли другой способ сказать браузеру открыть другую страницу?

РЕДАКТИРОВАТЬ: Из ответов я понял, что это возможно сделать с помощью различных хаков, но мне было бы лучше просто иметь код обработки и отображения в одном файле. Я доволен этим; это был эксперимент больше всего на свете.


person thornate    schedule 22.11.2008    source источник


Ответы (8)


Действительно ли необходимо вызывать другую страницу после завершения обработки? Я бы, наверное, сделал следующее:

<form method="post" action="display.php">
...
</form>

дисплей.php:

if ($_POST) {
    require_once(process.php);
    process($_POST);
    display_results;
}

с process.php, содержащим код, необходимый для обработки почтового запроса.

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

person Josh Smeaton    schedule 24.11.2008

Вы можете сохранить эти данные в сеансе, например. в первом файле, который обрабатывает сообщение

session_start();
$_SESSION['formdata'] = $_POST; //or whatever

то вы можете прочитать это на следующей странице, как

session_start();
print_r($_SESSION['formdata']);

или вы можете передать его через GET: (но, согласно комментариям, это плохая идея)

header('Location: page.php?' . http_build_query($_POST)); 

Если вы это сделаете, убедитесь, что вы выполняете дополнительную обработку/проверку на page.php, поскольку злоумышленник может изменить переменные. также вам может не понадобиться весь пост, передаваемый на следующую страницу

Изменить

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

person Tom Haigh    schedule 22.11.2008
comment
Я бы проголосовал за вас за предложение сеанса и проголосовал бы за предложение получить, так что не голосуйте за вас. - person pilsetnieks; 22.11.2008
comment
@Nouveau: согласен, я просто хотел показать, что это вариант без гражданства, но я должен был дать понять, что это менее предпочтительно - person Tom Haigh; 22.11.2008
comment
Я согласен с Nouveau. Второе предложение действительно является плохой практикой - person Dan Soap; 22.11.2008

Вы можете использовать JavaScript как грязный обходной путь:

<form id="redirect_form" method="post" action="http://someserver.com/somepage.php">
    <input type="hidden" name="field_1" value="<?php echo htmlentities($value_1); ?>">
    <input type="hidden" name="field_2" value="<?php echo htmlentities($value_2); ?>">
    <input type="hidden" name="field_3" value="<?php echo htmlentities($value_3); ?>">
</form>
<script type="text/javascript">
    document.getElementById('redirect_form').submit();
</script>

(скрипт должен быть под формой)

person Tom    schedule 22.11.2008

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

короче нельзя

person Gareth    schedule 22.11.2008

Насколько я знаю, это обычно делается в два этапа:

  1. В form.php отправьте данные в скрипт process.php.
  2. Сценарий process.php обрабатывает данные, но сам ничего не выводит, он всегда вызывает заголовок («Расположение: asdasd») для перенаправления на страницу success.php или failure.php (если применимо).
person activout.se    schedule 22.11.2008

Сделайте все это в одном скрипте и просто выведите другой HTML для результатов.

<?php  if($doingForm)  {   ?>

html for form here

<?php } else { ?>

html for results

<? } ?>
person user10117    schedule 24.11.2008
comment
Нажатие кнопки обновления здесь после $doinForm = true приведет к повторной отправке формы. Это может вызвать нежелательное поведение. См. adamv.com/dev/articles/getafterpost. - person alex; 21.04.2009

Эта проблема беспокоила меня в течение некоторого времени. Моя пользовательская CMS выполняет довольно сложную обработку, загрузку и манипулирование, поэтому иногда выводит довольно длинные сообщения об ошибках и информационные сообщения, которые не подходят для преобразования в данные GET, и я всегда хотел избежать проблемы с перезагрузкой данных INSERT, но пока не нашел адекватного решения.

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

Мне очень нравится решение для хранения переменных SESSION, но возникает вопрос, как обеспечить правильное уничтожение данных SESSION? Пока вы гарантируете, что отправляете только информацию (сообщения/ошибки), а не данные, которые должны/могли бы быть сохранены (и, следовательно, потенциально конфиденциальны), этой проблемы можно избежать.

person DisasterMan    schedule 15.12.2008

Надеюсь, я правильно понял ваш вопрос. Вы можете попробовать это:

  1. Настройте форму так, чтобы она выглядела следующим образом:

метод формы = "POST" action = "process_data.php"

2. Затем вы создаете файл process_data.php, который неожиданно обрабатывает данные.
И в этом файле вы используете заголовок:
Например:

$head = sprintf("page.php?data1=%d?data2=%d",$data1,$data2);
заголовок($head);

Надеюсь, я смог помочь.

person NiklasMM    schedule 22.11.2008
comment
хм ... если вы проголосуете за меня, может быть, вы могли бы дать мне причину?!?! - person NiklasMM; 22.11.2008
comment
Я не минусовал вас, но приведенный вами пример кода не сработает. - person Tom Haigh; 23.11.2008
comment
header($head) должен быть header('Location: ' . $head); Однако этот пример выглядит как плохая практика.... - person alex; 21.04.2009