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

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

Код для получения информации из формы и использования ее для заполнения следующей страницы:

<?php
$firstname = $_GET['personsName'];
echo "My Name is" .$firstname;
?>

И форма будет выглядеть так:

<form action="letter.php" method="get">
<input type="text" name="personsName"></input>
<input type="submit" value="submit">
</form>

Код для выбора страницы:

$pages = array('Page 1' => 'page1.php', 'Page 2' => 'page2.php', 'Page 3' => 'page3.php');

if (array_key_exists($_POST['dropdown-name'], $pages)) {
header("Location: " . $pages[$_POST['dropdown-name']]);
} else {
echo "Error processing form"; // submitted form value wasn't in your array, perhaps a hack attempt
}

Мне нужно, чтобы оба они работали в одной и той же форме, я просто не смог понять это. Что я пробовал:

<form action="<?=$pages?>" method="POST">
<input type="text" name="name" /><br />
<select name="letter">

<option value="Page 1">
Page 1
</option>

<option value="Page 2">
Page 2
</option>

<option value="Page 3">
Page 3
</option>

</select>
<input type="submit" value"Print" />
</form>

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

Текущий код таков:

<script type="text/javascript">
$(function UpdateFormAction(){
alert('Launched event handler');
var form = document.getElementById('MyForm');
var list = document.getElementById('PageList');
alert('List item numer ' + list.selectedIndex);
var desiredAction = list.options[list.selectedIndex].value
alert('Desired action set to ' + desiredAction);
form.action = desiredAction;
});
</script>

Форма:

<form id="MyForm" action="letter.php" method="POST">
<input type="text" name="name" /><br />
<select id="PageList" name="letter" onchange="UpdateFormAction();">

<option value="letter.php">Page 1</option>
<option value="letter2.php">Page 2</option>
<option value="letter3.php">Page 3</option>
</select>
<input type="submit" value"Print" />
</form>

person Zach    schedule 26.01.2011    source источник


Ответы (1)


Вы теряете данные, отправленные на сервер, когда выполняете перенаправление.

По сути, у вас есть 3 варианта:

  • Храните данные на клиенте с помощью файла cookie или аналогичного (много накладных расходов для чего-то простого).
  • Храните данные на стороне сервера в сеансе или аналогичном (даже больше накладных расходов)
  • Передайте данные через URL-адрес, на который вы перенаправляете...

Итак, что-то вроде:

if (array_key_exists($_POST['dropdown-name'], $pages)) {
    header("Location: " . $pages[$_POST['dropdown-name']] . "?personsName=" urlencode($_POST['name']));
} else {
    //Blah
}

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

NB: в форме вы назвали переменную name, а в получающей ее странице вы назвали ее personsName — обратите внимание на сопоставление одной переменной с другой в URL-адресе.

Решение Javascript (проверено):

<html>
    <head>
        <title>SO Demo</title>
    </head>
    <body>

    <script type="text/javascript">
        function UpdateFormAction(){
            var form = document.getElementById('MyForm');
            var list = document.getElementById('PageList');
            var desiredAction = list.options[list.selectedIndex].value
            form.action = desiredAction;
            document.getElementById('Target').innerHTML = 'Form action set to: ' + desiredAction;
        }
    </script>

    <form id="MyForm" action="letter.php" method="POST">
        Name: <input type="text" name="name" /><br />
        Page: <select id="PageList" name="letter" onchange="UpdateFormAction();">
            <option value="letter.php">Page 1</option>
            <option value="letter2.php">Page 2</option>
            <option value="letter3.php">Page 3</option>
        </select>
        <input type="submit" value="Print" /><br/>
        <span id="Target">Form action unmodified</span>
    </form>
    </body>
</html>
person Basic    schedule 26.01.2011
comment
В реальной форме я бы получил 10 фрагментов информации для заполнения перенаправленной страницы. Это слишком много, чтобы использовать этот метод? - person Zach; 26.01.2011
comment
Существует ограничение на длину URL-адресов (1024 символа для IE6, не менее 4096 для всех более поздних/более современных браузеров, если я правильно помню), поэтому это будет зависеть от того, какие данные. простые поля ввода должны быть в порядке, но большие текстовые области могут быть проблемой. - person Basic; 26.01.2011
comment
о, и, конечно же, вы можете использовать какой-нибудь простой javascript, чтобы при изменении раскрывающегося списка action формы менялся на соответствующую страницу - тогда в середине не будет шага PHP, и вы отправляете прямо на нужную страницу. - person Basic; 26.01.2011
comment
Это было бы идеально, решение javascript! Можете ли вы привести мне быстрый пример? - person Zach; 26.01.2011
comment
И я только что преобразовал его в функцию для лучшей читабельности. - person Basic; 26.01.2011
comment
Подождите, когда я тестировал это, он просто выполняет действие, которое уже есть, javascript не переключает действие на то, которое я выбрал. - person Zach; 26.01.2011
comment
Скорее всего, в JS есть опечатка, которая не отображается. Я добавил в код несколько предупреждений (обязательно удалите их как можно скорее!). Вы должны получить предупреждение о том, что метод сработал, другое, когда он определил выбранное значение в списке, и последнее, когда он собирается установить новую страницу. Дайте мне знать, какие предупреждения вы видите. Кроме того, в зависимости от используемого вами браузера, посмотрите, сможете ли вы найти сообщения об ошибках JS. В IE это обычно восклицательный знак в нижней панели главного окна. - person Basic; 26.01.2011
comment
Хорошо, ну, я начал понимать это, но я все еще не понимаю. Сначала он даже не загружал оповещения, и я понял, что так запускались функции. Должно быть $(функция UpdateFormAction()... и т. д. Затем появляются предупреждения. Но последнее предупреждение отображается еще до того, как я даже отправлю форму. В предупреждении говорится, что желаемое действие установлено на page1.php, прежде чем я выберу что-либо из раскрывающегося списка , Может быть, это потому, что выпадающий список по умолчанию находится на page1.php, тогда скрипт просто берет это и не ждет, пока форма не будет фактически отправлена ​​​​перед обработкой информации? - person Zach; 26.01.2011
comment
Я думаю, вы немного запутались - $( - это синтаксис, используемый в основном jQuery, библиотекой Javascript. Это не обязательно, но удобно. Событие onchange может запускаться при загрузке страницы. Оповещения должны отображаться каждый раз, когда вы меняете раскрывающийся список, а не при отправке формы. Можете ли вы опубликовать свой текущий код в конце вопроса? - person Basic; 26.01.2011
comment
Сначала он ничего не делал, пока я не добавил в него $(. Я знаю, что это только для jquery, но только что попробовал, и он начал показывать предупреждения. Idk, lol. Я загружаю jquery в страница, может ли это мешать javascript? И все предупреждения появляются сразу, когда я загружаю страницу. Ничего не появляется, когда я меняю раскрывающийся список. - person Zach; 26.01.2011
comment
Я отредактировал свой код для полной проверки. Если вы скопируете/вставите его в новый файл и откроете его в браузере, он отлично работает. Если есть проблемы, когда вы делаете то же самое на сайте, что-то еще мешает, но не видя полного вывода с вашей страницы, я не могу предположить, что это может быть. - person Basic; 26.01.2011
comment
У нас есть взлет. Я проверил несколько страниц, все работает отлично! Спасибо, что помогли мне пройти через это! Я снял вызов jquery, я думаю, что по какой-то причине это могло вызвать проблему? Я поставил все точно так же, как у вас здесь, и это работает отлично. - person Zach; 26.01.2011
comment
именно так - $() выполнялась, когда документ заканчивал загрузку, чтобы он мог оценивать вызовы jQuery - вы фактически связывали свой код с document.onload (ну, не совсем - но достаточно близко) - person Basic; 26.01.2011