PHP - Форма: сохранять записи/выборы при отправке формы

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

Как заставить форму сохранять данные до тех пор, пока отправка формы не будет успешной?

РЕДАКТИРОВАТЬ:

Метод отправки формы — $_POST, и форма отправляется на другую страницу.

Это должно быть сделано строго с PHP, поскольку решения Javascript/Jquery могут быть заблокированы сценарием более безопасными пользователями.


person Anthony Miller    schedule 03.11.2011    source источник


Ответы (4)


Ну вот. Это будет работать и не зависит от Javascript:

form.php //страница формы

<?php session_start(); ?>
<form method="post" action="action.php">
    <input type="text" id="input1" value="<?php echo (isset($_SESSION['fields']) ? $_SESSION['fields']['input1'] : '') ?>" />
    <input type="text" id="input2" value="<?php echo (isset($_SESSION['fields']) ? $_SESSION['fields']['input2'] : '') ?>" />   
</form>

action.php // страница действий

<?php
    session_start();

    //do your validation here. If validation fails:

    $_SESSION['fields']['input1'] = $_POST['input1'];
    $_SESSION['fields']['input2'] = $_POST['input2'];

    //redirect back to form.php
?>
person xbonez    schedule 04.11.2011

Является ли форма POST или GET? В любом случае у вас есть доступ ко всем представленным полям в переменных PHP $_POST или $_GET. В вашем HTML вы можете передать эти значения (если они установлены) в значение по умолчанию для каждого элемента ввода HTML. Таким образом, если это первый раз, они будут пустыми, а если произошла ошибка, значения будут заполнены заново.

person Patrick    schedule 03.11.2011
comment
Это не сработает, если форма отправляется на другую страницу, верно? Если форма находится в form.php и отправляется на action.php, после того, как action.php не пройдет проверку и перенаправит обратно на form.php, $_POST будет очищен. - person xbonez; 03.11.2011
comment
Истинный. Я предположил, что он был отправлен на ту же страницу, что, вероятно, было плохим предположением. В этом случае, когда вы перенаправляете обратно на форму, вы можете вставить $_POST или $_GET в сеанс. - person Patrick; 03.11.2011
comment
Да, это то, что я понял. Либо добавьте данные в $_SESSION, либо при перенаправлении обратно в form.php добавьте данные в $_GET - person xbonez; 03.11.2011
comment
@BenM: для отправки формы из action.php потребуется Javascript. Если в браузере нет JS (не поддерживается или отключен), разве он не потерпит неудачу довольно эффектно? - person xbonez; 03.11.2011
comment
ОК, или добавить переменные как входящие ссылки? Таким образом, они доступны (т.е. $_GET) - person BenM; 03.11.2011
comment
Я думаю, что мы предполагаем совсем немного. Разработчик еще даже не показал нам свой код... лол - person ; 04.11.2011
comment
Используется метод $_POST. И форма отправляется на другую страницу. =( Я не знаком с использованием $_SESSION. - person Anthony Miller; 04.11.2011
comment
@Mechaflash: опубликован ответ о том, как использовать $_SESSION для достижения того, что вам нужно - person xbonez; 04.11.2011

Если это выбранные значения, вы можете сделать что-то вроде этого:

<select name="my_select" id="my_select">
    <option value="123"<?php if($_REQUEST['my_select'] == 123) echo ' selected="selected"; ?>>123</option>
</select>

Если у вас есть обычный ввод текста, вы можете просто применить переменную $_REQUEST к атрибуту value:

<input type="text" name="my_text" value="<?php echo $_REQUEST['my_text'] ?>" />
person BenM    schedule 03.11.2011

Я предлагаю запретить переход страницы от отправки до тех пор, пока данные не будут проверены. Введите jQuery :)

<script type="text/javascript" src="jquery-library.js"></script>
<script type="text/javascript">
    $(document).ready(function(){
        // Wait for the user to click on your button
        $('#submit_button').click(function(){
            // Check each form field for an appropriate value
            if ($('#form_field1').val() != 'something I expect')
            {
                alert('Wrong submission!');
                return false;
            }
            // Forward the user to some url location
            window.location = 'url';
            return false;
        });
    });
</script>
person Community    schedule 03.11.2011
comment
Есть много способов выполнить то, что я предлагаю... у каждого из них есть свои нюансы, и может потребоваться некоторое время, чтобы все это заработало, но в конце концов, держу пари, это сделает вас счастливее... - person ; 03.11.2011
comment
Приятно, когда JQuery выполняет проверку формы, но если Javascript отключен и проверка падает на PHP-скрипт, вам также понадобится какой-то способ повторно заполнить поля в этом случае. - person xbonez; 03.11.2011
comment
Хороший комментарий, но, как я уже говорил выше, все эти идеи — просто идеи, пока мы не сможем определить, является ли js частью проекта или нет. Пока мы просто не знаем. - person ; 04.11.2011
comment
@xbonez, в этом ты прав. некоторые люди (например, я) используют блокировщики скриптов. Поэтому я бы предпочел, чтобы он просто выполнял действие при отправке формы, а не активно. - person Anthony Miller; 04.11.2011
comment
Использование блокировщика скриптов в современном Интернете сломает всю сеть... по большей части - person ; 04.11.2011
comment
@Nur, когда ты работаешь в отделе информационных технологий. и финансовый сектор, эта проблема встречается немного чаще. Но я никогда не говорил, что не собираюсь его использовать =D. Я хотел бы разрешение PHP, но я знаю, что jquery и javascript - более простые решения. - person Anthony Miller; 04.11.2011