6-7个小时我一直在讨论这个问题,但找不到问题,也找不到解决方案。
我一直在我的服务器上编写一个多步骤注册表单,我必须将它移动到一个专用的Windows服务器,使用php 5.2.17和apache 2.2。 问题是在这种新环境中,它没有按预期工作。我的脚本的逻辑如下(这是我文件中的顺序):
header("location: {$_SERVER['PHP_SELF']}?page=the_next_step");
$_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");
这是服务器设置问题吗?
答案 0 :(得分:2)
问题解决了。 似乎DNS提供商具有“隐藏”功能,该功能在帧中显示内容,因此IE安全性不会从帧中保存会话变量。
答案 1 :(得分:0)
这几乎肯定是一个会话问题。会话ID(标识服务器用户的元素)可以通过以下两种方式之一存储在客户端上:
mysite.com/index.php?page=step1&sid=03c7c0ace395d80182db07ae2c30f034
中(sid
是必须保留的会话ID的示例)。 如果您未能保存会话ID,会话将会死亡,服务器将无法正确记住(或识别)您的用户。