【问题标题】:Passing session variables to more than 3 page and back in php将会话变量传递给超过 3 个页面并返回 php
【发布时间】:2014-05-15 09:56:43
【问题描述】:

第一页(inputform1test.php)

    <?php require_once('Connections/Project.php'); ?>
<?php

if (!isset($_SESSION)) {
  session_start();
}
?>
<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Input (Test)</title>
</head>

<body>
<form id="form1" name="form1" method="post" action="inputdisplaytest.php">
  <p>Name 
  <input type="text" name="name" id="textfield" />
  </p>
  <p>Text 
    <input type="text" name="text" id="textfield2" />
  </p>
  <p>
    <input type="submit" name="button" id="button" value="Submit" />
  </p>
</form>
</body>
</html>

第二页(inputdisplaytest.php) 测试它是否在第二页(inputdisplaytest.php)

<?php include('Connections/Project.php'); ?>
<?php

if (!isset($_SESSION)) {
  session_start();
}

$_SESSION['name']= $_POST['name'];
$_SESSION['text']= $_POST['text'];

?>



<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Display Input (Test)</title>
</head>


<body>
<table width="200" border="0">
  <tr>
    <td><?php echo $_SESSION['name']?></td>
    <td><?php echo $_SESSION['text']?></td>
  </tr>
</table>
<a href="inputdisplaytest_2.php">inputdisplaytest_2.php</a>
</body>
</html>

第三页(inputdisplaytest2.php) 这是我得到错误的部分

<?php include('Connections/Project.php'); ?>
<?php

if (!isset($_SESSION)) {
  session_start();
}

?>



<!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>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>Display Input (Test)</title>
</head>


<body>
<table width="200" border="0">
  <tr>
    <td><?php echo $_SESSION['name']?></td>
    <td><?php echo $_SESSION['text']?></td>
  </tr>
</table>
<p><a href="inputdisplaytest.php">inputdisplaytest.php</a></p>
</body>
</html>

我点击查看它是否仍在第二页上工作。 (这不起作用) 当我通过浏览器单击返回按钮时,我在转到超链接和“文档已过期”时遇到了 undefinex 索引问题。

如何让会话变量恢复/不过期? 任何帮助将不胜感激。

【问题讨论】:

    标签: php html forms session


    【解决方案1】:

    你不需要

    if (!isset($_SESSION)) {
      session_start();
    }
    

    只需在脚本开头使用 session_start() 即可。甚至在这些包括之前。

    在 session_start 之前你不能打印任何东西。检查您的日志是否有错误。

    【讨论】:

      【解决方案2】:

      我相信您发现此错误的原因是您正在发布表单数据。当您发布表单数据时,它会在您点击提交时发送。返回表单会给你重新加载表单数据的消息。如果您将其更改为 GET,您的表单数据应该会保留。

      【讨论】:

      • 试试这个session_cache_limiter('private_no_expire');
      • 我还建议对任何表单都遵循这种格式以避免将来出现这些错误:link
      • 它也不起作用(session_cache_limiter('private_no_expire');)。我把它放在每个页面(除了表单页面)的会话开始()之后的顶部。
      • @Escii 你想在 session_start() 之前调用它;
      【解决方案3】:
      1. 删除您用来检查会话是否设置的 if 语句,因为在您的情况下, session_start() 永远不会被执行,因为 $_SESSION 数组总是由 PHP 设置,除非您执行已弃用的 unset($_SESSION),这将取消设置整个 $_SESSIONunset($_SESSION) 因为这将禁用通过 $_SESSION 超全局数组注册会话变量。所以:

        if(!isset($_SESSION)){
            session_start();
        }
        

        变成:

        session_start();
        

        这解决了未定义索引错误的问题。

      2. 要在导航回处理表单的页面时解决浏览器返回按钮错误,您必须输入:

        session_cache_limiter('private_no_expire');
        

        second.php文件的session_start()之前,这行代码避免了"Page Has Expired"警告,你可以找到更多这里解释avoid "Page Has Expired" warnings

      3. 最后,在second.php文件的session_start()之后,添加以下代码:

        if(isset($_POST['button'])){
            $_SESSION['name']= $_POST['name'];
            $_SESSION['text']= $_POST['text'];
        }
        

        检查表单是否已提交,如果是,您可以处理数据并显示页面,否则您只需使用之前存储在会话中的数据来显示页面。

      【讨论】:

      • 请不要只是张贴代码墙,请解释发生了什么变化。
      • 对不起@Andrew,这是我在 stackoverflow 上的第一个答案。我会在以后尝试详细说明我的答案,并感谢您的评论
      【解决方案4】:

      我自己也遇到过这个问题,会话变量没有传递,最近遇到了答案。很抱歉,我无法信任在之前的帖子中回答此问题的人,因为我无法再次找到该帖子。简而言之,有时,尤其是在共享主机上,会话没有存储在正确的位置。您可以通过强制将会话保存在特定位置来解决此问题。我的解决方案是:

      ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) . '/session'));
      

      我的会话文件位于域的根文件夹中。

      然后我开始会话:

      session_start();
      

      然后我确保此人已登录:

      if(isset($_SESSION["your_variable"])) {
      $your_variable = $_SESSION["your_variable"];
      //add any other session variables in the same manner
      //be sure to rename "your_variable" with the name of your variable
      }else{
      header('Location: signin.php');
      exit;
      }
      

      底部的标头重定向是该人在未登录或未找到会话变量时要去的地方,以便将会话变量传递到此页面。请注意退出,它使您的代码更安全。所以我的第一行代码是:

      ini_set('session.save_path',realpath(dirname($_SERVER['DOCUMENT_ROOT']) .   `'/session'));`
      session_start();
      if(isset($_SESSION["your_variable"])) {
      $your_variable = $_SESSION["your_variable"];
      }else{
      header('Location: signin.php');// or wherever your sign in happens to be
      exit;
      }
      

      我希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-04-25
        • 2018-09-28
        • 2011-06-12
        • 1970-01-01
        • 2012-09-16
        • 2014-03-23
        • 1970-01-01
        相关资源
        最近更新 更多