1

我早些时候写了一篇关于这个的帖子,并得到了很好的回复,纠正了我的一个错误,我认为这解决了问题。不幸的是它没有,而且我的旧帖子很混乱,我将重新发布这个问题,但是有了额外的视角,我已经在这个问题上挣扎了好一阵子。

代码(简化):

<?php
session_start();

if (!$_SESSION["companyid"]) {

header("location: http://www.somepage.com");

}

mysql_connect("localhost", "name", "password") or die(mysql_error());
mysql_select_db("database") or die(mysql_error());

$companyid = $_SESSION["companyid"];

$_SESSION["youtubeurl"] = mysql_real_escape_string($_POST["youtubeurl"]);
$_SESSION["logourl"] = mysql_real_escape_string($_POST["logourl"]);

$_SESSION["plan1head"] = mysql_real_escape_string($_POST["plan1head"]);
$_SESSION["plan1description"] = mysql_real_escape_string($_POST["plan1description"]);
$_SESSION["plan1headline1"] = mysql_real_escape_string($_POST["plan1headline1"]);
$_SESSION["plan1price1"] = mysql_real_escape_string($_POST["plan1price1"]);
$_SESSION["plan1headline2"] = mysql_real_escape_string($_POST["plan1headline2"]);
$_SESSION["plan1price2"] = mysql_real_escape_string($_POST["plan1price2"]);
$_SESSION["plan1price1type"] = mysql_real_escape_string($_POST["plan1price1type"]);
$_SESSION["plan1price2type"] = mysql_real_escape_string($_POST["plan1price2type"]);

if(isset($_POST["submitpreview"])) {

$companyid = $_SESSION["companyid"];

$youtubeurl = $_SESSION["youtubeurl"];
$logourl = $_SESSION["logourl"];
$plan1head = $_SESSION["plan1head"];
$plan1description = $_SESSION["plan1description"];
$plan1headline1 = $_SESSION["plan1headline1"];
$plan1price1 = $_SESSION["plan1price1"];
$plan1headline2 = $_SESSION["plan1headline2"];
$plan1price2 = $_SESSION["plan1price2"];
$plan1price1type = $_SESSION["plan1price1type"];
$plan1price2type = $_SESSION["plan1price2type"];

}

?>

现在,涉及到三个页面/实例:

  1. 带有将变量传递到预览页面的表单的页面
  2. 预览页面
  3. 提交的预览页面(意思是页面被刷新)

一个人有自己的页面,其中包含各种文本字段和下拉菜单(第 1 页)。他们可以更新此页面,当他们填写表单并提交时,这些变量将传递到预览页面。如果他们喜欢预览页面,则确认(提交执行“submitpreview”的表单)。

这是我的问题:表单填写的所有会话变量(除了公司 ID 之外的所有变量,当他们第一次登录时存储在会话中)会立即转储到会话变量中。我已经在预览页面的底部回显了这些会话变量(只是为了确认它们此时不是空的),当我到达预览页面时,它们的内容会被适当地回显。但是,当用户确认更改并设置了提交预览时,突然这些会话变量为空。也就是说,表单变量填充的所有会话变量都是空的。除了 companyid 变量之外,在页面刷新之前很好地回显的会话变量都消失了。由于 companyid 会话变量仍然很好,所以我知道(1)我的服务器上的会话必须正常工作,(2)问题在于将表单变量转储到会话中或检索这些变量的代码。关于为什么会发生这种情况的任何理论?

这让我很沮丧。感谢您在这个问题上对我的耐心,并感谢您提供的任何帮助。

4

2 回答 2

1

想通了,以为我会分享。

在这种情况下,当您的会话变量等于刷新页面上的发布变量时,您要小心。当我的预览页面刷新时,帖子变量(因为它们不再存在)变为空,这覆盖了我之前保存的会话变量的信息,进而使这些会话变量也为空。我不得不相应地调整我的代码来解决这个问题。

于 2013-02-11T20:31:53.597 回答
0

如 Pete_1s 回答中所述,该问题是由 register_globals 引起的。这会导致具有相同名称的不同变量混合在一起。这个:

foreach ($_SESSION AS $name -> $value) {
  unset ($_GLOBALS[$name]);
}
foreach ($_POST AS $name -> $value) {
  unset ($_GLOBALS[$name]);
}
foreach ($_GET AS $name -> $value) {
  unset ($_GLOBALS[$name]);
}

如果您无法停用 register_globals,将解决问题。

于 2015-01-09T09:30:50.397 回答