HTML表单无法使用PHP正确提交

时间:2011-12-01 23:06:20

标签: php apache2 windows-server-2008-r2

6-7个小时我一直在讨论这个问题,但找不到问题,也找不到解决方案。

我一直在我的服务器上编写一个多步骤注册表单,我必须将它移动到一个专用的Windows服务器,使用php 5.2.17和apache 2.2。 问题是在这种新环境中,它没有按预期工作。我的脚本的逻辑如下(这是我文件中的顺序):

  1. 创建我的3个表单对象(使用method = post和action =同一个文件)
  2. 验证每个表单,如果为true,则将输入的数据放入会话中,然后执行header("location: {$_SERVER['PHP_SELF']}?page=the_next_step");
  3. 开始显示页面,并根据$_REQUEST['page'],呈现必要的表单对象(如果页面呈现形式1没有值,如果页面= 2的值呈现形式2,依此类推)。
  4. 以IE为例;当我填写第一个表格并提交时,它甚至不会进入验证if语句。

    在firefox中我可以完成这些步骤,但在地址栏中我看不到我的查询字符串(page = 2,page = 3)。

    知道可能是什么问题吗? 是否有必须在服务器上的php / apache上进行的设置? GET或POST或提交数据是否存在问题? 而且我看到一个非常奇怪的事情:我的页面的源代码正在<framesets>呈现。

    运行PHP 5.2.17 + Apache 2.2 Windows 2008服务器

    好的,经过一些研究后我发现我可能与会话有关。 我看到在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 个答案:

答案 0 :(得分:2)

问题解决了。 似乎DNS提供商具有“隐藏”功能,该功能在帧中显示内容,因此IE安全性不会从帧中保存会话变量。

答案 1 :(得分:0)

这几乎肯定是一个会话问题。会话ID(标识服务器用户的元素)可以通过以下两种方式之一存储在客户端上:

  1. 它可能是一个cookie,在这种情况下,您需要确保客户端已启用cookie,并且他不会在操作过程中删除它们。
  2. 它可以作为GET变量,在这种情况下,您需要确保会话ID保留在GET mysite.com/index.php?page=step1&sid=03c7c0ace395d80182db07ae2c30f034中(sid是必须保留的会话ID的示例)。
  3. 如果您未能保存会话ID,会话将会死亡,服务器将无法正确记住(或识别)您的用户。