与会话奇怪的PHP错误

时间:2011-05-05 23:37:27

标签: php

我正在尝试在我的网页上加载$_SESSION变量和另一个变量。

此处的页面结构是第1页 - >第2页 - >第3页;它是一种多部分形式。第2页上有一个后退按钮,允许您返回到第1页。我正在尝试使用会话变量来保持第1页中的输入字段不变。

我使用表单提交从第1页到第2页。以下是处理检索POST变量的适用的PHP代码:

    <?php
$retailerName = $_POST["retailerName"];
$description = $_POST["description"];
$savingsDetails = $_POST["savingsDetails"];
$terms = $_POST["terms"];
$phone = $_POST["phone"];
$address = $_POST["address"];
$zone = $_POST["zone"];
$dateExp = $_POST["dateExp"];
$tag = $_POST["tag"];

$_SESSION["rn"] = $retailerName;
$_SESSION["de"] = $description;
$_SESSION["sd"] = $savingsDetails;
$_SESSION["tm"] = $terms;
$_SESSION["ph"] = $phone;
$_SESSION["ad"] = $address;
$_SESSION["zo"] = $zone;
$_SESSION["ex"] = $dateExp;
$_SESSION["tg"] = $tag;
?>

我知道变量设置正确。

我可以这样做:

 echo $retailerName;
 echo $_SESSION["rn"];

在第2页上,它将显示我想要的内容。唯一的问题是会话变量不会延续到Page 1。

如果我将会话变量设置为字符串,它将返回到第1页。出于某种原因,即使发布的变量有效并且包含正确的字符串,会话变量也不会将它们带过来。

如果我这样做:

 $_SESSION["rn"] = $retailerName;

然后会话变量的值不会转移到Page 1。

如果我这样做:

 $_SESSION["rn"] = "asdf";

然后会话变量的值将转移到Page 1。

通常情况下,这只是意味着我发布的变量很糟糕,但在这种情况下我知道它们可以正常工作,因为页面的其余部分专门用于输出已发布的变量,而且它正确地完成了。

SESSID保持不变,所以这不是问题。我也能够在网站的其他部分继承其他会话变量,并且它们可以很好地工作。

为什么$_SESSION变量不会将适当且有效的已发布变量传递给第1页,但它会携带一个字符串?

Page 1 Pastebin

Page 2 Pastebin

4 个答案:

答案 0 :(得分:1)

你忘记了

session_start();

在PHP的顶部(或附近)?

表单的type属性是否设置为POST

答案 1 :(得分:0)

不确定这里的完整情况,但是......

在我看来这里的事件流存在问题,我会尝试包含语句来在if语句中设置会话变量,如:

if($retailerName){
  $_SESSION['rn'] = $retailerName;
  ...........
}

也许某种方式在设置POST变量后会再次调用第2页,这会将会话变量重置为空,因为没有POST数据。

也有可能这些第1页和第2页正在iframe中使用?如果是这样,那么加载第1页和第2页的顺序可能不正确。

答案 2 :(得分:0)

如果在返回第1页时执行print_r($ _ SESSION)的var_dump($ _ SESSION)会发生什么?好像你使用了session_start(),因为$ _SESSION ['rn'] =“abc”确实有效。

您还应该知道文件顶部的设置(因此$ retailerName = $ _POST ['零售商'])应该在某些检查中。

if($_SERVER['REQUEST_METHOD'] == "POST") {
  $retailerName = $_POST['retailer'];
  $_SESSION['rn'] = $retailerName;
}

否则,当再次访问页面时,所有内容都将被删除(因此有一个空的$ _POST数组会删除$ _SESSION ['rn']值。

答案 3 :(得分:0)

您在页面1的顶部是否有相同的代码?

$retailerName = $_POST["retailerName"];
$description = $_POST["description"];
$savingsDetails = $_POST["savingsDetails"];
$terms = $_POST["terms"];
$phone = $_POST["phone"];
$address = $_POST["address"];
$zone = $_POST["zone"];
$dateExp = $_POST["dateExp"];
$tag = $_POST["tag"];

在尝试使用以下内容获取属性之前,可能所有变量都已重置:

$_SESSION["rn"] = $retailerName;
echo $_SESSION["rn"] // this will not be what you want now

我唯一能想到的是第1页上的内容是重置$ _SESSION数组。在第1页和第2页的顶部执行print_r($ _ SESSION)并在第2页顶部执行print_r($ _ GET),在第2页底部执行另一个print_r($ _ SESSION)。

现在转到浏览器中的第1页。你的值是否设置为null?再次填写第1页的表格并发布到第2页。第2页是否显示您的表格值?也许表单值没有正确传递给第2页。

如果您看到表单值,那么$ _SESSION数组中的属性设置应该有效。您应该会在第2页的底部看到$ _SESSION数组正确打印出来。

返回第1页。会话变量是否已打印出来?如果没有,那么有些东西会覆盖$ _SESSION数组。检查包含/所需文件。