2011-12-01 49 views
0

6-7小时,我一直在用这个问题燃烧我的脑袋,但找不到问题或解决方案。HTML表单不能正确提交使用PHP

我一直在我的服务器上的多步注册表单工作,我必须将它移动到一个专用的Windows服务器与PHP 5.2.17和Apache 2.2。
问题是,在这个新的环境中,它不能按预期工作。我的脚本的逻辑是下面的(这是在我的文件的顺序):

  1. 创建我3点形式的对象(用方法=交和行动=相同的文件)
  2. 验证每个窗体,并且如果true将输入的数据放入会话中,然后执行header("location: {$_SERVER['PHP_SELF']}?page=the_next_step");
  3. 开始显示页面并取决于$_REQUEST['page'],呈现必要的表单对象(如果页面呈现表单1没有值,如果page = 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"); 这是服务器设置问题吗?

+1

请问您可以添加一些代码,以便我们可以看到您现在拥有的东西。也放入正在呈现的HTML将是有帮助的 –

+0

我认为你正在使用短打开标签** <?**但你没有在php.ini中打开它 – ncank

+1

如果你不能解决它看着代码,我们怎么会没有看到它? – vascowhite

回答

2

问题已解决。 看来,DNS提供商有一个“隐形”功能,它显示一个框架中的内容,所以IE安全性不会保存来自框架的会话变量。

+0

只要您有能力,请确保将此答案标记为已接受,以便其他人知道有解决方案。 –

0

这几乎肯定是会话问题。会话ID(识别您的用户对服务器的元素),可以被存储在客户端上2方法之一:

  1. 这可能是一个cookie,在这种情况下,你需要确保客户端有启用cookies并在操作过程中不会擦除它们。
  2. 它可能是一个GET变量,在这种情况下,您需要确保会话ID保留在GET mysite.com/index.php?page=step1&sid=03c7c0ace395d80182db07ae2c30f034sid是必须保留的会话ID的示例)。

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

+0

我看到了,但还有两件事我不明白:在Firefox上,会话正在使用POST数据保存,然后标题(位置)将我重定向到page = 2。为什么不在IE中工作? Windows服务器上的会话设置是否错误?我的问题是,在我的共享服务器上(这是在Linux上),这个脚本完美地工作。 –