Как сделать многостраничную html форму
Индекс материала |
---|
Как сделать многостраничную html форму |
Как сделать многостраничную html форму стр.2 |
Как сделать многостраничную html форму стр.3 |
Все страницы |
Допустим нам необходимо использовать html форму, которая показывает более одной страницы и сохраняет данные при переходе от одной страницы к сле дующей. Для этого можно использовать сеансы (сесии):
session_start();
$_SESSION['username'] = $_GET['username'];
Можно также включать переменные из формы более ранней страницы в качестве скрытых полей ввода в более поздних страницах:
<input type="hidden" name="username" value="<?php echo htmlentities($_GET['username']); ?>">
При любой возможности используйте сеансы! Это более безопасно, поскольку пользователь не может модифицировать переменные сеанса. Чтобы начать сеанс, вызовите функцию session_start(), которая создаст новый сеанс или продолжит существующий. Заметим, что этот этап не является необходимым, если в файле php.ini установлен параметр session.auto_start.
Кстати, если в файле php.ini установлен параметр session.auto_start то session_start() не обязательна!
Переменные, присвоенные глобальному массиву $_SESSION, автоматически передаются между сценариями. В примерах, показанных ниже, переменная формы username сохраняется с помощью присваивания элемента $_GET['username'] элементу $_SESSION['username'].
Для получения доступа к этому значению в последующем запросе вызовите функцию session_start(), а затем проверьте элемент $_SESSION['username']:
session_start(); $username = htmlentities($_SESSION['username']); print "Hello $username.";
В данном случае, если не вызвать функцию session_start(), то массив $_SESSION не будет установлен. Обеспечьте безопасность сервера и сохраните в секрете место расположения файлов сеанса (системных файлов, базы данных и т. д.); в противном случае ваша система будет уязвима для соединений с ложной аутентификацией.
Если использование сеансов не разрешено для вашей инсталляции PHP, то взамен можно использовать скрытые переменные формы. Однако передача данных с помощью скрытых элементов формы небезопасна, поскольку кто нибудь может отредактировать эти поля и подделать запрос, но приложив небольшие усилия, можно повысить безопасность до приемлемого уровня.
Основной способ применения скрытых полей состоит в том, чтобы включить их внутрь html формы.
<form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get">
<input type="hidden" name="username" value="<?php echo htmlentities($_GET['username'])?>" />
После того как эта html форма будет отправлена повторно, элемент $_GET['username'] будет содержать предыдущее значение, если только кто нибудь не поменяет его. Есть и более сложное, но безопасное решение – преобразовать переменные в строку с помощью PHP функции serialize(), вычислить секретный хеш из данных применив PHP функцию md5() и поместить обе части информации в форму. Затем в следующем запросе проверьте достоверность данных и выполните обратное преобразование.
Если данные не пройдут проверки на достоверность, вы будете знать, что кто то пытался модифицировать информацию. Кодирующая функция pc_encode(), показанная в примере ниже принимает данные для декодирования в виде массива.
Пример pc_encode():
$secret = 'Foo25bAr52baZ'; function pc_encode($data) { $data = serialize($data); $hash = md5($GLOBALS['secret'] . $data); return array($data, $hash); }
В функции pc_encode() данные преобразуются в строку, вычисляется контрольный хеш и эти переменные возвращаются. Функция pc_decode(), показанная в примере ниже делает работу обратную той, которую выполнил ее двойник.
Пример pc_decode():
function pc_decode($data, $hash) { if (!empty($data) && !empty($hash)) { if (md5($GLOBALS['secret'] . $data) == $hash) { return unserialize($data); } else { error_log("Validation Error: Data has been modified"); return false; } } return false; }
Функция pc_decode() вновь создает хеш секретного слова с данными и сравнивает его со значением хеша из формы. Если они равны, то переменная $data считается достоверной и поэтому над ней выполняется обратное преобразование. Если проверка заканчивается неудачей, то функция записывает сообщение в журнал ошибок и возвращает false.
Эти функции работают вместе следующим образом:
<?php $secret = 'Foo25bAr52baZ'; // Загружаем старые данные и проверяем их достоверность if (! $data = pc_decode($_GET['data'], $_GET['hash'])) { // попытка взлома } // Обрабатываем форму (новые данные формы находятся в $_GET) // Обновляем $data $data['username'] = $_GET['username']; $data['stage']++; unset($data['password']); // Кодируем результаты list ($data, $hash) = pc_encode($data); // Сохраняем данные и хеш внутри формы ?> <form action="<?php echo $_SERVER['PHP_SELF']; ?>" method="get"> ... <input type="hidden" name="data" value="<?php echo htmlentities($data); ?>"> <input type="hidden" name="hash" value="<?php echo htmlentities($hash); ?>"> </form>
В начале сценария мы передаем функции pc_decode() переменные из формы для декодирования. Как только информация загружена в массив $data, обработку формы можно продолжить, проверяя новые переменные в массиве $_GET, а старые переменные в $data.
После завершения проверки обновляем массив $data, сохраняя в нем новые переменные, вычисляя по пути хеш. Наконец, выводим новую форму и включаем $data и $hash как скрытые переменные.
Информация копипастерам
Внимание! Копирование контента с сайта, возможно только с разрешения администратора. Т.е. Меня! Я скорее всего разрешу Вам это сделать, в обмен на живую ссылку, на статью оригинал.