PHP открыть другую веб-страницу с данными POST - PullRequest
8 голосов
/ 22 ноября 2008

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

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

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

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

Ответы [ 8 ]

17 голосов
/ 22 ноября 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, и, возможно, он менее безопасен, поскольку пользователи могут более очевидно манипулировать данными.

6 голосов
/ 24 ноября 2008

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

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

display.php:

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

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

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

3 голосов
/ 22 ноября 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>

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

0 голосов
/ 15 декабря 2008

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

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

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

0 голосов
/ 24 ноября 2008

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

<?php  if($doingForm)  {   ?>

html for form here

<?php } else { ?>

html for results

<? } ?>
0 голосов
/ 22 ноября 2008

AFAIK это обычно делается в два этапа:

  1. В form.php, POST данные в сценарий process.php
  2. Сценарий process.php обрабатывает данные, но никогда ничего не выводит сам, он всегда вызывает header ("Location: asdasd") для перенаправления на страницу success.php или fail.php (если применимо)
0 голосов
/ 22 ноября 2008

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

Короче, это невозможно

0 голосов
/ 22 ноября 2008

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

  1. Настройте свою форму так:

form method = "POST" action = "process_data.php"

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

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

Я надеюсь, что смогу помочь.

...