【问题标题】:Why is my php session not persisting?为什么我的 php 会话没有持续存在?
【发布时间】:2014-07-30 21:16:25
【问题描述】:

好的,我有一个关于 php 会话的奇怪问题。我正在使用会话跨页面传输信息。我的问题是,在某些情况下(通常是十分之一)我收到一条错误消息:PHP Notice: Undefined index: $myVar.有趣的是,会话在应用程序的第一部分持续存在,然后似乎消失了。

流程如下。

  1. 用户登陆登录页面,输入用户密码后点击提交。
  2. 应用程序转到收集信息并使用数据类收集和存储信息的控制页面。
  3. 数据类将信息存储到一个数组中,然后将该数组放入会话中,
  4. 然后控制页面使用该信息发送电子邮件,并将用户转发到欢迎页面。
  5. 电子邮件使用会话变量以及欢迎页面。即使欢迎页面没有,电子邮件也始终包含信息。

这是欢迎页面的顶部,会话开始是第一行。

<?php session_start(); ?>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"   "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<link rel="shortcut icon" href="./rmilogo.png" type="img/png" />
<title>Welcome!</title>

这是控制页面

<?php
session_start();

function getDealer() {
require '../data/DealerDB.php';

$action = filter_input(INPUT_POST, 'response');
$dealerID = filter_input(INPUT_POST, 'dCode');
new DealerDB('****************', $dealerID);

$cmpDealer = $_SESSION['dealer'];

if (!$cmpDealer['dCode'] == '' || !is_null($cmpDealer['dCode'])) {
    require '../business/AutoEmail.php';

try{
        new AutoEmail($action, $cmpDealer['dCode']);
    }catch(Exception $e) {
        trigger_error('Message: ' . $e->getTraceAsString()); 
    }
    header("Location: http://www.*******.com/welcome.php");
} else {
    header("Location: http://www.*******.com/error.html");
}
}

getDealer();

再次从页面顶部开始会话。 这是数据检索类的顶层。

<?php
session_start();

$_SESSION['dealer'] = null;
require '../business/Dealer.php';




class DealerDB {

private $host;
private $user;
private $passkey;
private $db;    

function __construct($db, $dealerCode) {

    $this->host = '*******';
    $this->user = '*******';
    $this->passkey = '*******';
    $this->db = $db;

    $_SESSION['dealer'] = $this->buildDealer($dealerCode);
}

再次从顶部开始会话, 这里的问题是,当控制类调用电子邮件时,它会起作用,而且大多数时候会话转移到下一页也是如此。但是,有时会话变量不会持续存在并且信息会丢失并且在程序的其他任何地方都找不到,我只是得到一个 $mySessionVar is not set 错误。

【问题讨论】:

  • 这里的清单不错:stackoverflow.com/a/17242347/2329487
  • @shudder 这真是太棒了,有趣的是我直到我尝试切换服务器并理解了这个问题才意识到这个问题,我会回答我自己的问题让所有人看到所以检查一下在下面

标签: php session session-variables


【解决方案1】:

好的,所以@shudder 发布了一个非常有用的列表,直到我切换主机时我才意识到这一点。这个的关键是域,并确保我留在当前域中。当我在本地主机上运行时,这不是问题,因为它总是通过 localhost 加载,而我的 www 文件夹来自 WAMP。但是,当您部署到托管站点的大坏世界时,情况会发生变化。您可以通过访问 www.your_website.com 或只是 your_website.com 访问该站点。当您尝试携带会话变量并且使用从 www.your_website.com 到 www.your_website.com 以及从 your_website.com 到 your_website.com 的标头重定向时,结果很好,但是如果您尝试从www.your_website.com 到 your_website.com 不起作用。它们在会话的眼中是不同的,因此会话似乎消失了。那么我们如何解决它你可以做两件事之一,我的第一个建议将是最简单的

1) 转到您的托管面板并将您的任何可能的域名替代重定向到您在标题中使用的域名,因此如果您有:

headers("Location: http://www.yourdomain.com/welcome.php");

可以这么说,您想确保如果有人在地址栏中键入 yourdomain.com 他们被重定向到 www.yourdomain.com/index.php 可以这么说,这样标题总是对齐并同意。

你也可以像这样检查地址栏

$server=$_SERVER['HTTP_HOST'];

在 if 语句中使用 server 来测试 uri 是否等于 www.yourdomain.com 或等于 yourdomain.com 并以这种方式处理标头。

如果我遗漏了任何内容,请告诉我,但这绝对是一次很棒的学习体验,因为会话变量的性质以及在部署最终应用程序时必须小心谨慎。感谢大家的帮助,我再次期待。

【讨论】:

    【解决方案2】:

    答案 2

    也许您所包含的其中一个文件也正在启动一个新会话。这会清除会话的当前状态。

    PHP Session Variable Lost

    回答 1

    为什么要在session_start() 之后关闭 PHP 标记,然后再重新打开它们?

    例如,而不是这个:

    <?php session_start(); ?>
    <?php
    
    function getDealer() {
    require '../data/DealerDB.php';
    

    这样做:

    <?php 
    session_start();
    
    function getDealer() {
    require '../data/DealerDB.php';
    

    我没有看过你的代码。但是,马上,我可以告诉你,关闭这些标签会导致各种不稳定的行为。

    Zend Framework's Guidelines on File Formatting

    Why We Don't Close Tags...

    【讨论】:

    • 我刚开始这样做是为了纠正认为会话开始距离页面顶部不够近的问题哈哈,我已经尝试了几乎所有我能想到的想法,似乎没有任何效果,所以我尝试了。它也没有帮助,尽管在那之前它们只是在第一个 php 开始标签下,但我现在真的没有任何其他答案,而是一时冲动改变了。这个问题真的很难缩小范围,因为它不会一直发生。
    • @raidenace 你碰巧知道为什么他们可能不会在十分之一的情况下坚持但似乎在其余时间都有效。
    • @Kayce Basques,好的,我认为您给出的第一个答案与我一直在经历的事情很接近,我将 session_start 从我的电子邮件课程中取出,看看是否可能是问题所在不走运我还重建了控制类,以便在控制页面的原始功能之外创建经销商,我认为也许我正在处理某种功能丢失问题,但仍然没有运气。有什么想法吗?
    • 什么都没有出现在我身上。在这一点上,如果我站在你的立场上,我会通过在尝试引用变量之前检查是否已设置变量来开始防御性编程。我喜欢相关主题的答案中“处理问题的方法”部分中描述的策略:stackoverflow.com/a/4261200/1669860
    • @kayce basque 我试过了,我也试过在返回欢迎页面之前声明第二个小玩意,同样的结果适用于 90% 的尝试失败 10%
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-05-14
    • 2020-01-20
    相关资源
    最近更新 更多