使用PHP不能正确提交HTML表单


HTML form not submitting correctly using PHP

6-7个小时以来,我一直在为这个问题头疼,但既找不到问题,也找不到解决方案。

我一直在我的服务器上的多步骤注册表工作,我必须将其移动到专用的windows服务器与php 5.2.17和apache 2.2。
问题是,在这种新环境下,它并没有像预期的那样发挥作用。我的脚本的逻辑如下(这是我文件中的顺序):

  1. 创建我的3个表单对象(方法=post和动作=相同的文件)
  2. 验证每个表单,如果为真,则将输入的数据放入会话中,然后执行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服务器

好的,经过更多的研究,我发现我可能与会话有关。我看到在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");这是服务器设置问题吗?

问题解决。似乎DNS提供商有一个"隐形"功能,它在一个框架中显示内容,因此IE安全不会从一个框架中保存会话变量。

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

  1. 它可能是一个cookie,在这种情况下,你需要确保客户端已经启用了cookie,并且他不会在操作中间删除它们。
  2. 它可以作为GET变量,在这种情况下,您需要确保会话ID保留在GET mysite.com/index.php?page=step1&sid=03c7c0ace395d80182db07ae2c30f034中(sid是必须保留会话ID的示例)。

如果您未能保存会话ID,会话将终止,服务器将无法正确记住(或识别)您的用户。