HTML-форма неправильно отправляется с использованием PHP - PullRequest
0 голосов
/ 02 декабря 2011

В течение 6-7 часов я жгла голову этой проблемой, но не могла найти ни проблему, ни решение.

Я работал над многоэтапной регистрационной формой на моем сервере, и мне нужно перенести ее на выделенный сервер Windows с php 5.2.17 и apache 2.2.
Проблема в том, что в этой новой среде она работает не так, как ожидалось. Логика моего сценария следующая (и это порядок в моем файле):

  1. Создайте мои 3 объекта формы (с методом = post и action = один и тот же файл)
  2. Проверьте каждую форму и, если true, поместите введенные данные в сеанс, а затем выполните header("location: {$_SERVER['PHP_SELF']}?page=the_next_step");
  3. Начать отображение страницы и, в зависимости от $_REQUEST['page'], отобразить необходимый объект формы (если значение для страницы 1 не отображается, если значение для страницы = 2, отображать форму 2 и т. Д.).

В IE например; когда я заполняю первую форму и отправляю ее, она даже не доберется до утверждения if.

В Firefox я могу пройти через шаги, но в адресной строке я не вижу строки моего запроса (page = 2, page = 3).

Есть идеи, в чем может быть проблема?
Есть ли какие-либо настройки, которые должны быть выполнены на php / apache на сервере? Есть ли проблема с GET или POST или отправкой данных? И еще я вижу очень странную вещь: исходный код моей страницы отображается в <framesets>.

Запуск PHP 5.2.17 + Apache 2.2 Windows 2008 server

Ладно, после еще одного исследования я обнаружил, что могу иметь какое-то отношение к сессиям. Я вижу, что в IE сессия не работает и разрушается. Это код:

<?php 
    session_start();
    if (!isset($fv)) $fv = &$_SESSION['rgform']['page1'];
    if (!isset($fv1)) $fv1 = &$_SESSION['rgform']['page2'];
    if (!isset($fv2)) $fv2 = &$_SESSION['rgform']['page3']; 

Теперь я создаю свои объекты

if ($form->validate()) 
{
    $_SESSION['rgform']['page1'] = $_POST;
   header("location: {$_SERVER['PHP_SELF']}?page=step2");
}

if ($form2->validate()) 
{
   $_SESSION['rgform']['page2'] = $_POST;
   header("location: {$_SERVER['PHP_SELF']}?page=step3"); 
}

if ($form3->validate()) 
{
   $_SESSION['rgform']['page3'] = $_POST;
   header("location: {$_SERVER['PHP_SELF']}?page=step4");
}

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>

<!-- load my css, js etc -->
<body>
if(!isset($_REQUEST['page']) )
{
    $form->render('custom-template.php');

}
elseif( $_REQUEST['page']== "step2" && $_SESSION['rgform']['page1']['pagename']== "part_det" ) // on each form i have an hidden input with the name "pagename" and different value
{
    $form2->render('custom-template-2.php');
}
elseif($_REQUEST['page']== "step3" && $_SESSION['rgform']['page2']['pagename']=="comp_det")
{
    $form3->render('custom-template-3.php');
}
elseif($_REQUEST['page']== "step4" && $_SESSION['rgform']['page3']['pagename']== "buss_det")
{
    echo "Thanks!!";
    session_destroy();
}
</body>
</html>

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

Еще одна интересная вещь: я не могу увидеть строку запроса в адресной строке моего браузера, даже если после проверки формы 1 я сделаю: header("location: {$_SERVER['PHP_SELF']}?page=step2"); Это проблема с настройкой сервера?

Ответы [ 2 ]

2 голосов
/ 03 декабря 2011

Проблема решена.Похоже, что у провайдера DNS есть функция «маскировки», которая отображает содержимое во фрейме, поэтому безопасность IE не сохраняла переменные сеанса из фрейма.

0 голосов
/ 02 декабря 2011

Это почти наверняка проблема сеанса.Идентификатор сеанса (элемент, который идентифицирует ваших пользователей для сервера), можно сохранить на клиенте одним из двух способов:

  1. Это может быть файл cookie, в этом случае вам необходимо убедиться, чтоу клиента включены файлы cookie, и он не стирает их в середине действия.
  2. Это может быть переменная GET, в этом случае необходимо убедиться, что идентификатор сеанса остается в GET * 1006.* (sid является примером для идентификатора сеанса, который должен быть сохранен).

Если вам не удастся сохранить идентификатор сеанса, сеанс умрет, и сервер не запомнит (или не определит) ваши пользователи правильно.

...